Android Back Stack - UP按钮方法

时间:2013-06-29 17:47:03

标签: android

我有Activity A(主要)和Activity B

事实:活动A有:android:launchMode="singleInstance"

通常的情况是:

  1. 用户启动应用程序> Activity A
  2. 用户点击商品> Activity B

    3.A。如果用户点击后退/上移按钮>返回A不在B上调用finish()

    • 用户点击之前的同一项>至B
    • 此时他可以在没有新情况的情况下来回走动。它全部在堆栈中,不会重新创建活动。 (好吧!)

    http://i41.tinypic.com/jkyuyg.jpg

    3.B。如果用户单击“主页”,则转到任务管理器并将应用程序置于前面> Activity B(一切都很好,到目前为止)

    • 如果用户单击UP按钮,它会转到TASK MANAGER,我希望它转到Activity A(后退按钮预计会以这种方式工作,所以让我们专注于UP按钮)。
  3. 以下是我在Activity B中对BACK和UP按钮的实现。

    @Override   
    public void onBackPressed() {
        moveTaskToBack(true);
        // I don't want to finish() the activity, so the user can reclick the same
        // item without reloading the whole activity again (webview slow when parsing html).
        return;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                moveTaskToBack(true);
                // I don't want to finish() the activity... idem.
                // I need to implement here the bring Activity A to front
            break;
        }
    }   
    

    所以,我想要的是:到“返回”到Activity A保持使用堆栈重新加载活动B的想法,如果需要,不使用Intents(除非它调用活动到前面,不添加项目到堆栈。)

    如果我清楚地解释了自己以及是否需要更多信息,请告诉我。


    更新

    我在http://developer.android.com/training/implementing-navigation/ancestral.html

    找到了这个

    这就是我改编它的方式。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent upIntent = new Intent(this, Activity_A.class);
                if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                    TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
                } else {
                    moveTaskToBack(true); // I want it this way. Don't worry.
                }
            break;
        }
    }
    

    但NavUtils.shouldUpRecreateTask方法总是返回false。

    我做了http://developer.android.com/training/implementing-navigation/ancestral.html#SpecifyParent部分,所以这不是问题。

    我的问题是,我想知道堆栈中是否存在Activity A,以及是否从任务管理器启动应用程序。

    我怎样才能做到这一点? 感谢。

1 个答案:

答案 0 :(得分:1)

moveTaskToBack将整个任务移动到后台。它没有完成活动。

为了完全控制活动,您有一些可能的解决方案:

  1. 为活动创建自己的全球经理,在整个生命周期中监控每个活动,并决定在每个活动中做些什么。

  2. 你也可以在离开它之后立即完成每个活动,并将“它”(只是它的名字或其他东西)放在一个堆栈中,并在你回到它时恢复它的状态。

  3. 使用片段,并在一个活动上管理它们。但是请注意配置更改。