我有一个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());
}
答案 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的参考文档