如何以当前状态恢复现有任务

Posted

技术标签:

【中文标题】如何以当前状态恢复现有任务【英文标题】:How to resume an existing task in its current state 【发布时间】:2015-11-17 06:15:19 【问题描述】:

我的应用程序有两个活动 A 和 B。A 是任务的根,是从启动图标启动的任务。 B可以从A开始。

除了从启动图标启动 A 外,还可以通过单击另一个应用程序中的文件来启动 A,例如单击云端硬盘中的电子邮件附件或文件。我通过向清单文件中的意图过滤器添加操作和类别来完成此操作。

我想这样当 A 从另一个应用程序启动时,而不是创建一个新任务,我希望现有任务恢复到它之前的相同状态。这可能是活动 A 或 B,无论用户在按下 Home 键之前碰巧在哪里。

我尝试了各种启动模式和意图标志,但似乎没有任何效果。

【问题讨论】:

【参考方案1】:

广播与清单中的启动器意图相同的意图:

Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

我不知道为什么,但这会引发现有任务而不是开始新任务。相比之下,以“官方”方式获得的启动器意图实际上会启动一个新任务:

Intent intent = context.getPackageManager()
   .getLaunchIntentForPackage(context.getPackageName());

【讨论】:

试过这个,它似乎工作,至少在具有 API 26 的 Pixel 设备上。唯一需要注意的是,任务在没有进入动画的情况下重新打开。 但官方解决方案适用于谷歌地图和谷歌浏览器(不创建新任务)。不知道他们是如何实现的。我尝试了所有可能的启动模式,但没有成功【参考方案2】:

将启动模式更改为单任务。并监听 onNewIntent()

【讨论】:

如果将启动模式更改为单任务,则可以使用onNewIntent检测到已接收到新意图,但如果旧任务已被接收,则知道已接收到新意图是无用的销毁。 你可以编码 onNewIntent(getIntent());在 onCreate 中。

以上是关于如何以当前状态恢复现有任务的主要内容,如果未能解决你的问题,请参考以下文章

Flink 任务失败重启与恢复策略

Flink 任务失败重启与恢复策略

如何设计可手动终止及查看当前进度的任务

java 文件下载,支持任务暂停,恢复,断点续传;任务状态查询;任务并发控制

使用云祺虚拟机备份软件瞬时恢复Citrix XenServer 虚拟机

使用云祺虚拟机备份软件瞬时恢复H3C CAS 虚拟机