清除活动的Intent标志,使其恢复原来的启动行为



我的应用程序有一个活动定义为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来"重启"这个根activity, PendingIntent包含Intent. flag_activity_clear_top标志。

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

UPDATE:实际上,我的问题只适用于尝试使用"最近的应用程序"启动器将应用程序带到前台。如果我使用设置->应用启动器,它会完全从头开始启动应用程序。但它仍然没有"恢复"应用程序,就像我覆盖默认启动意图之前那样。还请注意,如果我使用长按home恢复,应用程序确实会按预期恢复。是什么不同的"最近的应用程序"启动器,使它不断重复使用的意图?

所以在这一点上,每次他们通过启动器恢复应用程序时,它都会"清除顶部"并重新开始,而不是像使用通知意图之前那样简单地恢复应用程序。这是因为它是同一个活动的实例,而那个活动继续使用它被启动时的意图启动。在这种情况下,这意味着它每次都有FLAG_ACTIVITY_CLEAR_TOP标志。

这篇文章几乎是一针见血,但我的特殊问题没有解决。在这篇文章中,他们讨论了如何正确地忽略(或使用)这个重用意图的Bundle中的Extras。但是我不能想出一种方法来清除标志的意图,使它停止启动使用CLEAR_TOP标志。

我只希望它使用CLEAR_TOP标志启动一次,当通知被按下时。我希望应用程序的后续启动与按下通知之前的方式相同,这只是在用户所在的任何地方恢复应用程序/活动堆栈(而不是每次从头开始)。

我理解为什么活动重用意图。我只需要找到一种方法来阻止它这样做,或者以某种方式从该意图清除CLEAR_TOP标志,以便它回到工作,因为它在PendingIntent用FLAG_ACTIVITY_CLEAR_TOP标志重新启动活动之前。

提前感谢您的帮助。

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

通过调用moveTaskToBack(true)当他们按回根活动时,我得到了一致的"恢复"功能,当应用程序被用户"重新启动"时。因为我没有完全关闭,不得不重新打开/重新创建应用程序,所以我能够绕过Intent被重新用于Launcher活动的问题。

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

最新更新