【问题标题】:Clear Intent flags from an activity so that it resumes its original launch behavior从 Activity 中清除 Intent 标志,使其恢复其原始启动行为
【发布时间】:2013-04-17 00:14:04
【问题描述】:

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

This post 几乎是一针见血,但我的特殊问题没有解决。在这篇文章中,他们讨论了如何正确忽略(或使用)这个重用意图的捆绑包中的附加内容。但我想不出一种方法来清除该意图上的 标志,以便它停止使用 CLEAR_TOP 标志启动。

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

我了解活动为什么会重复使用意图。我只需要找到一种方法来阻止它这样做,或者以某种方式从该意图中清除 CLEAR_TOP 标志,以便它恢复到 PendingIntent 使用 FLAG_ACTIVITY_CLEAR_TOP 标志重新启动活动之前的工作状态。

提前感谢您的帮助。

【问题讨论】:

    标签: android android-intent android-pendingintent flags


    【解决方案1】:

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

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

    【讨论】:

    • 你能给我发一个这样的例子吗,我有类似的问题。
    • 是的,我不确定你的意思。你是怎么做到的?
    【解决方案2】:

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

    【讨论】:

    • 是的,我有。我尝试从它自己的 onNewIntent() 方法重新启动活动,以尝试将新意图(没有 CLEAR_TOP 标志的意图)附加到活动。所以我完成(),开始活动()。 onCreate 再次被调用(所以我可以告诉它实际上“重新创建”了活动,它的标志 = 0)。但是,当我将应用程序移到后台时,然后使用启动器重新启动,第一个意图(来自 PendingIntent 的那个)是正在使用的意图,因为它再次清除顶部并且具有从通知 PendingIntent 传递的相同附加内容。
    • 如果你想重新加载它,为什么不关闭应用程序而不是将其移动到后台。或者只使用finish();在每个 Activity 中确保当您再次运行您的应用时,它会加载第一个 Activity。
    • 我不想只是“重新加载”,我想清除 Activity 堆栈,这就是我使用 CLEAR_TOP 标志的原因。我只是希望应用程序在从最近应用程序启动器列表重新启动后正确恢复,而不是继续使用其中包含 CLEAR_TOP 标志的意图。
    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多