【问题标题】:Android - use of FLAG_ACTIVITY_NEW_TASKAndroid - 使用 FLAG_ACTIVITY_NEW_TASK
【发布时间】:2019-12-16 21:59:30
【问题描述】:

我创建了一个带有按钮的简单应用程序。单击它会触发通知,单击通知会启动同一应用程序的新实例。但是,我希望单击通知应该让我回到触发通知的应用程序实例。为此,我查阅了 Android 文档以获取 FLAG_ACTIVITY_NEW_TASK 标志-

使用此标志时,如果您现在正在启动的活动已经在运行任务,则不会启动新的活动;相反,当前任务将简单地以其上次所处的状态被带到屏幕的前面。有关禁用此行为的标志,请参见 FLAG_ACTIVITY_MULTIPLE_TASK。

在创建传递给 PendingIntent 的意图时,基于此,我设置了此标志。但是,单击通知仍会启动应用程序的新实例。

我做错了什么?

【问题讨论】:

  • 您正在启动的Activity 是否已经在您的应用中启动(当您点击通知时),或者您是否正在您的应用中启动不同的Activity?
  • @StevenByle :不,它与我想要启动的活动相同 - 正在运行并触发通知的活动。
  • 嗯,也许可以发布您的Intent 代码...也许我们缺少一些简单的东西...
  • 它应该像你描述的那样工作。如果它没有这样做,我敢打赌你已经被一个长期存在且非常讨厌的 Android 错误所困扰。请参阅我对this question的回答

标签: android android-intent flags


【解决方案1】:

请记住,当您单击 Notification 时,意图是从该 Context 启动的。 那个上下文在它的任务上没有 Activity(事实上,它将是一个空白任务)。

这会导致相同Activity 的两个版本(尽管Application 仍然只有一个实例)运行。每个Activity 运行不同的Task。

如果您的任何堆栈中都不需要相同类型的重复活动,您可以在此处使用答案:

https://stackoverflow.com/a/2327027/726954

否则,有很多方法可以“修复”这个问题,包括单例变量和跟踪哪些活动处于运行状态的应用程序上下文方法。

您可能需要针对这些搜索和优化您的问题。

【讨论】:

  • 好的..但是当我们创建 PendingIntent 时,我们将启动活动的上下文指定为 getActivity() 的第一个参数。所以不应该根据那个上下文开始吗?还是我错过了什么?
  • 另外,如果文档说“如果您现在开始的活动的任务已经在运行,那么新的活动将不会启动”,那么在这种情况下,任务不是活动正在运行?
  • 在Tasks 上阅读一下。这是关于 getActivity 的文档 - developer.android.com/reference/android/app/…, int, android.content.Intent, int) - 它说“请注意,该活动将在现有活动的上下文之外启动”
  • 在我使用的一个使用通知的应用程序上,我使用 getBroadcast() 并让我的每个活动注册广播接收器来处理来自通知的调用(以及没有活动时的默认备用接收器抓住它)。
  • 谢谢!!我发现某些部分的文档非常混乱..基本上对于 PendingIntent,我们应该使用 getApplicationContext() 作为第一个参数对吗?
【解决方案2】:

Android 中的任务是一个单独的用户工作流程。如果您有时会看到主屏幕,这通常意味着您开始一个新的。 删除标志,它应该可以工作。如果没有,请尝试使用单顶。

【讨论】:

  • 嗯,我没听懂……点击通知时,应该会出现触发我通知的同一实例。如果我不设置任何标志,则会启动一个新实例,我不想要那个..
  • 然后尝试使用单顶。你想要完成的事情实际上很棘手——我家里有这方面的代码,以后可以查阅。
  • @meredrica 非常感谢您提供一些见解,以解决类似的问题。我结束了使用清单的android:launchMode="singleTop",但是当我即时回收偏好活动更改主题时,它会阻止应用程序有回溯历史。谢谢。
【解决方案3】:

试试下面的代码:

Intent resultIntent = new Intent(context, YourActivity.class);

resultIntent.setAction(Intent.ACTION_MAIN)       resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                resultIntent, 0);


 .setContentIntent(pendingIntent)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多