我的应用程序有一个定义为 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 用于启动包括 Intent.FLAG_ACTIVITY_CLEAR_TOP的活动。
更新:实际上,我的问题仅适用于尝试使用“最近的应用程序”启动器将应用程序带到前台。如果我使用设置-> 应用程序启动器,它会完全从头开始启动应用程序。它仍然没有像在我覆盖默认启动意图之前那样“恢复”应用程序。另请注意,如果我使用 longpress-Home 简历,该应用程序会按预期恢复。 “最近的应用程序”启动器有什么不同,使它不断重复使用该意图?
因此,在这一点上,每次他们通过启动器恢复应用程序时,它都会“清除顶部”并从头开始,而不是像使用通知的意图之前那样简单地恢复应用程序。发生这种情况是因为它是 Activity 的同一个实例,并且该 Activity 继续使用启动它的意图启动。在这种情况下,这意味着它每次都有 FLAG_ACTIVITY_CLEAR_TOP 标志。
这篇文章几乎是一针见血,但我的特殊问题没有解决。在这篇文章中,他们解决了如何正确忽略(或使用)这个重用意图的捆绑包中的附加内容。但是我想不出一种方法来清除该意图上的标志,以便它停止使用 CLEAR_TOP 标志启动。
我只希望它在按下通知时使用 CLEAR_TOP 标志启动一次。我希望应用程序的后续启动以与按下通知之前相同的方式执行,这只是在用户所在的任何地方恢复应用程序/活动堆栈(而不是每次都从头开始)。
我理解为什么活动会重复使用意图。我只需要找到一种方法来阻止它这样做,或者以某种方式从该意图中清除 CLEAR_TOP 标志,以便它像 PendingIntent 使用 FLAG_ACTIVITY_CLEAR_TOP 标志重新启动活动之前那样恢复工作。
提前感谢您的帮助。