Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在ActivityGroup中,如何恢复上一个活动(无需重新启动)_Android - Fatal编程技术网

Android 在ActivityGroup中,如何恢复上一个活动(无需重新启动)

Android 在ActivityGroup中,如何恢复上一个活动(无需重新启动),android,Android,我有一个ActivityGroup,它在一个选项卡中有4个活动 A1->A2->A3->A4 假设我从任何正在重新启动的活动中按back键。我的要求当我调用一个新的活动时,它应该重新开始。当我按下后退按钮时,必须恢复上一个活动(不重新启动) 请帮我做这个。我缺乏设置适当的意图标志。我的代码是这样的 public void startChildActivity(String Id, Intent intent) { Window window; Log

我有一个ActivityGroup,它在一个选项卡中有4个活动

A1->A2->A3->A4

假设我从任何正在重新启动的活动中按back键。我的要求当我调用一个新的活动时,它应该重新开始。当我按下后退按钮时,必须恢复上一个活动(不重新启动)

请帮我做这个。我缺乏设置适当的意图标志。我的代码是这样的

      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());

    }
public void startChildActivity(字符串Id、意图){
窗口窗口;
Log.e(“startChildActivity”、“startChildActivity”);
window=getLocalActivityManager().startActivity(Id,intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP));
如果(窗口!=null)
{
添加(Id);
setContentView(window.getDecorView());
}
} 
public void finishFromChild(活动子项)
{
restartFlag=true;
Log.e(“finishFromChild”、“finishFromChild”);
LocalActivityManager=getLocalActivityManager();
int index=mIdList.size()-1;
如果(指数<1){
完成();
回来
}
manager.destroyment(mIdList.get(index),true);
删除(索引);
索引--;
字符串lastId=mIdList.get(索引);
Intent lastIntent=manager.getActivity(lastId).getIntent();
Window newWindow=manager.startActivity(lastId、lastIntent.addFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP));
setContentView(newWindow.getDecorView());
}

首先,我建议您仔细阅读本文。并尝试了解不同的启动模式和意图标志是如何工作的

现在回答您的问题,如果操作系统决定为您终止活动,您将无能为力。基本上,一旦有另一个活动出现,您的活动就会处于onPause()状态。然后,如果操作系统确定内存不足(除其他外),它将调用move it to ondestory()。任何数量的意图标志都不能为您更改此行为。因此,从您上面描述的情况来看,您的活动似乎是被置于onPause()后被选择销毁的不幸活动之一

所以。。。你能做些什么来解决你的问题?这就是你应该做的:

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


我还建议您非常仔细地阅读本参考文件,首先,我建议您非常仔细地阅读本文。并尝试了解不同的启动模式和意图标志是如何工作的

现在回答您的问题,如果操作系统决定为您终止活动,您将无能为力。基本上,一旦有另一个活动出现,您的活动就会处于onPause()状态。然后,如果操作系统确定内存不足(除其他外),它将调用move it to ondestory()。任何数量的意图标志都不能为您更改此行为。因此,从您上面描述的情况来看,您的活动似乎是被置于onPause()后被选择销毁的不幸活动之一

所以。。。你能做些什么来解决你的问题?这就是你应该做的:

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


我还建议您仔细阅读本参考文件,我终于找到了解决方案。其实罪魁祸首是

   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找不到条目,因此无法删除它


更多信息请参考此链接

嗨,我终于找到了解决办法。其实罪魁祸首是

   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找不到条目,因此无法删除它

更多信息请参考此链接

只需更换线路即可

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

只需更换线路

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


是的,它是bug,那么它的解决方案是什么?是的,它是bug,那么它的解决方案是什么?提供一个解决方案是好的;答案中的解释更好,提供解决方案是好的;在答案中解释更好