清除活动中的Intent标志,以便恢复其原始启动行为

时间:2013-04-17 00:14:05

标签: android android-intent clear flags android-pendingintent

我的应用程序有一个定义为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标志。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

事实证明我的问题的根源是我完成了()我的根活动(在堆栈上没有活动)并因此在用户按下后退按钮时关闭应用程序。

当他们按下root活动时调用 moveTaskToBack(true),当用户“重新启动”应用程序时,我得到了我想要的一致“恢复”功能。由于我当时没有完全关闭并且不得不重新打开/重新创建应用程序,因此我能够绕过问题,将Intent重新用于Launcher活动。

答案 1 :(得分:0)

你尝试使用finish();然后再次调用Activity?