2

我的应用程序有一个定义为 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 标志重新启动活动之前那样恢复工作。

提前感谢您的帮助。

4

2 回答 2

1

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

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

于 2013-04-27T03:01:58.060 回答
0

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

于 2013-04-17T01:32:02.333 回答