在ActivityGroup中,如何还原以前的活动(不重新启动)

时间:2011-06-13 11:51:53

标签: android

我有一个ActivityGroup,它在Tab中有4个活动。

A1-> A2-> A3-> A4

假设我从任何活动中按回以前的活动正在重新启动。我的要求,当我打电话给新活动时,应该重新开始。当我按下后退按钮时,必须恢复上一个活动(不重新启动)。

请帮我解决这个问题。我缺乏设置适当的Intent Flags。我的代码是这样的。

      public void startChildActivity(String Id, Intent intent) {

        Window window;
        Log.e("startChildActivity","startChildActivity");

            window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

            if (window != null) 
            {
                mIdList.add(Id);

                setContentView(window.getDecorView());
            }


    } 


        public void finishFromChild(Activity child) 
    {
        restartFlag=true;

        Log.e("finishFromChild","finishFromChild");
        LocalActivityManager manager = getLocalActivityManager();

        int index = mIdList.size()-1;

        if (index < 1) {

            finish();

            return;
        }

        manager.destroyActivity(mIdList.get(index), true);

        mIdList.remove(index);

        index--;

        String lastId = mIdList.get(index);

        Intent lastIntent = manager.getActivity(lastId).getIntent();

        Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

        setContentView(newWindow.getDecorView());

    }

3 个答案:

答案 0 :(得分:3)

嗨,我最终得到了一个解决方案。实际上罪魁祸首是

   manager.destroyActivity(mIdList.get(index), true); 
代码中的

Android destroyActivity()函数impl中存在一个错误。

问题的确切来源是LocalActivityManager.java中的以下代码块:

public Window destroyActivity(String id, boolean finish) {
    LocalActivityRecord r = mActivities.get(id);
    Window win = null;
    if (r != null) {
        win = performDestroy(r, finish);
        if (finish) {
            mActivities.remove(r);
        }
    }
    return win;
}

变量mActivities是包含活动记录的hashmap,它使用传入startActivity()的id作为键。在此方法中,为密钥传入的对象是LocalActivityRecord而不是id字符串。这导致hashmap找不到条目,​​因此不会删除它。

更多信息请参阅此链接。 http://code.google.com/p/android/issues/detail?id=879More

答案 1 :(得分:3)

只需替换

Window newWindow = manager.startActivity(lastId,lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));

答案 2 :(得分:1)

首先,我建议你仔细阅读这篇文章:Tasks and Back Tasks。并尝试了解不同的launchModes和intent标志如何工作。

现在回答你的问题,如果操作系统决定为你杀死你的活动,你无能为力。基本上,只要另一个活动出现在您的活动上,您的活动就会处于onPause()状态。然后,如果操作系统决定它的内存不足(除其他外),它将调用将其移动到onDestroy()。没有多少意图标志可以为您改变此行为。因此,根据您在上面描述的内容,您的活动似乎是在将其放入onPause()之后被选中要被销毁的不幸之一。

那么......你能做些什么来解决你的问题?这是你应该做的:

您应该在活动中实施onSaveInstanceState()onRestoreInstanceState(),以保存和恢复下次活动在onCreate()中打开时所需的所有状态信息,您应该检查{{1}传递给您的对象尝试使用传递给您的savedState信息重建您的活动。

我还建议你仔细阅读这篇关于Saving Activity State的参考文档