我的应用程序有一个定义为launchMode =“singleTop”的活动,作为根活动。
<activity
android:name="com.package.LauncherActivity"
android:launchMode="singleTop"
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
应用程序创建通知,当单击时,使用PendingIntent“重新启动”此根活动,该PendingIntent包含具有标志Intent.FLAG_ACTIVITY_CLEAR_TOP的Intent。
Intent newIntent = new Intent(context, LauncherActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pi = PendingIntent.getActivity(
context,
(int)System.currentTimeMillis(),
newIntent,
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
这个想法是,无论该人当前在应用程序中,当他们点击通知时,它将清除活动堆栈并在此根活动中“从头开始”。
这一切都正常并且符合预期。我总是只有一个任务,并且在执行通知的PendingIntent时正确清除堆栈。
我的问题发生在其中一个通知“重启”之后。如果活动随后被放置在后台,然后使用其中一个发射器(最近的应用程序,设置 - >应用程序(请参阅下面的更新,不完全相同)等)重新启动,则使用通知使用的意图开始活动,包括Intent.FLAG_ACTIVITY_CLEAR_TOP 。
更新:实际上,我的问题仅适用于尝试使用“最近应用”启动器将应用程序带到前台。如果我使用Settings-&gt;应用启动器,则会从头开始完全启动应用。仍然没有“恢复”应用程序,就像我覆盖默认启动意图之前所做的那样。另请注意,如果我使用longpress-Home简历,应用程序将按预期恢复。 “最近的应用”启动器有什么不同之处让它继续重复使用这个意图?
所以在这一点上,每当他们通过启动器恢复应用程序时,它“清除顶部”并在开始时重新开始,而不是像使用通知的意图之前那样简单地恢复应用程序。发生这种情况是因为它与活动的实例相同,并且该活动继续使用启动它的意图启动。在这种情况下,这意味着它每次都有FLAG_ACTIVITY_CLEAR_TOP标志。
This post几乎击中了头部的钉子,但我的特殊问题没有得到解决。在这篇文章中,他们讨论了如何正确地忽略(或使用)这个重用意图的捆绑中的额外内容。但我无法找到一种方法来清除该意图上的标志,以便它使用CLEAR_TOP标志停止启动。
我只希望在按下通知时使用CLEAR_TOP标志启动一次。我希望应用程序的后续启动执行方式与按下通知之前的方式相同,只需在用户所在的位置恢复应用程序/活动堆栈(而不是每次都从头开始)。
我理解为什么活动会重新使用意图。我只需要找到一种方法来阻止它执行该操作,或以某种方式清除该意图中的CLEAR_TOP标志,以便它在PendingIntent重新启动活动之前返回工作状态,并使用FLAG_ACTIVITY_CLEAR_TOP标志。
提前感谢您的帮助。
答案 0 :(得分:1)
事实证明我的问题的根源是我完成了()我的根活动(在堆栈上没有活动)并因此在用户按下后退按钮时关闭应用程序。
当他们按下root活动时调用 moveTaskToBack(true),当用户“重新启动”应用程序时,我得到了我想要的一致“恢复”功能。由于我当时没有完全关闭并且不得不重新打开/重新创建应用程序,因此我能够绕过问题,将Intent重新用于Launcher活动。
答案 1 :(得分:0)
你尝试使用finish();然后再次调用Activity?