从概览屏幕恢复应用时未调用 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 恢复?

在Android中锁定屏幕时未调用BroadcastReceiver

SWIFT:触摸屏幕时未调用 touchesEnded

关闭屏幕时未调用 UICollectionView performBatchUpdates 完成