从概览屏幕恢复应用时未调用 onActivityResult(最近)
Posted
技术标签:
【中文标题】从概览屏幕恢复应用时未调用 onActivityResult(最近)【英文标题】:onActivityResult not called when app restored from Overview Screen (recents) 【发布时间】:2015-08-11 12:27:59 【问题描述】:我有 2 个活动,父母和孩子。 Parent 充当 Widget 配置类,因为它处理 APPWIDGET_CONFIGURE 的意图过滤器。
在 Parent 上选择一个项目会启动 Child 进行编辑。
Intent addNewIntent = new Intent(this,Child.class);
this.startActivityForResult(addNewIntent, EDIT_ACTIVITY_REQUEST);
孩子返回结果
...
setResult(RESULT_OK, resultIntent);
finish();
调用Parent类中的onActivityResult并处理结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
switch (requestCode)
//EditShortcutActivity returned
case EDIT_ACTIVITY_REQUEST:
if(resultCode == RESULT_OK)
...
当 AppWidget 添加到主屏幕时,Parent 活动从 APPWIDGET_CONFIGURE Intent 启动。可以启动 Child 活动并调用 Parent.onActivity 结果。工作正常。
一旦从 Parent 中选择了一个项目,就会调用 finish() 并正确配置小部件。父活动已关闭并显示主屏幕。
现在,如果用户再次从概览屏幕(最近的应用程序选择器)中选择父活动,然后用户选择要编辑的项目,则再次打开子活动。保存更改后,onActivityResult() 这次不会在 Parent Activity 中调用。
另外,getCallingActivity() 仅在这种情况下在子活动中返回 null。
我认为这与启动 Parent 的任务有关,因为它是从 AppWidget 配置启动的。
我怎样才能可靠地调用 onActivityResult()?
谢谢!
编辑:
我从来没有弄清楚为什么会发生这种情况,但是我找到了一种解决方法。当调用 Activity 来配置 Widget 时,我通过将标志附加到 Intent 来手动将其从历史堆栈中删除。
Intent currentIntent = getIntent();
currentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
setIntent(noBackstack);
当 Activity 从启动器正常启动时,它会显示在历史记录(概览)中并按预期工作。当开始配置 AppWidget 时,它不再显示在历史记录中。
希望这对某人有所帮助。
【问题讨论】:
【参考方案1】:我永远无法可靠地调用onActivityResult
。我想出了一个解决方法。
在启动时从历史堆栈中删除 Activity 以配置小部件。代码见编辑。
【讨论】:
以上是关于从概览屏幕恢复应用时未调用 onActivityResult(最近)的主要内容,如果未能解决你的问题,请参考以下文章
Activity之概览屏幕(Overview Screen)
移动到 1/3 屏幕宽度时未调用 onConfigurationChanged
在 Activity 重新创建时如何确定 Fragment 恢复?