【问题标题】:Prevent notification PendingIntent starts Activity already started?阻止通知 PendingIntent 启动 Activity 已经启动?
【发布时间】:2012-12-18 13:27:25
【问题描述】:

该服务创建一个持久的Notification 并通过PendingIntent 启动主要活动。这是代码。

Intent notificationIntent = new Intent(getApplicationContext(), ViewPagerActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(StreamingService.this, 0, notificationIntent, 0);

但是,如果当我按下通知时启动了主要活动,它将再次启动,然后再次启动......

最后,我把相同的活动堆积起来,一个在另一个之上。我可以通过按后退按钮看到这一点,这将杀死主要活动一次,然后让我回到同一个活动,直到我关闭最后一个活动。

如何防止这种情况发生? PendingIntent 是否可以检测到瞄准活动正在运行,因此它不会再次创建相同的活动,而是启动正在运行的活动?

附言。如果不能很好地解释这一点,我深表歉意。如果是这种情况,请告诉我,我会重新表述问题。

【问题讨论】:

  • 看看this post
  • 这个问题真的和通知无关;它们只是启动您的活动的机制,但任何其他机制都会出现您的问题。 @etienne 的答案包含您需要解决的问题;另一种选择是使用清单中的 android:launchMode 属性来正确设置此活动的启动模式。
  • @mah 你是对的。我会解决这个问题。

标签: android


【解决方案1】:

我也找到了这个解决方案。将此属性添加到Manifest

           <activity android:name=".MyActivity"
              android:label="@string/app_name"
              android:launchMode="singleTop"      // <-- THIS LINE
            >

对于每个Activity,您都需要此功能。到目前为止,它完全没有错误。

哪种解决方案更好?如果没有的话,我的更容易。

【讨论】:

  • 听起来也不错。如果您想针对不同的情况使用不同的选项,之前的解决方案(意图标志)会很有用; IE。根据用户操作,您可能希望以不同的方式启动活动。我猜这主要取决于您的应用程序导航架构。
  • +1 对我有用。为了更好地回答这个问题,请查看developer.android.com/guide/topics/manifest/…,它解释了它的工作人员是谁,并在活动的方法 onNewIntent 上捕捉到这个意图。
【解决方案2】:

根据您要实现的具体行为,您可以将这些标志之一作为 getActivity() 的最后一个参数传递:

【讨论】:

  • 谢谢。你能看看我的解决方案吗?有什么你不喜欢的地方吗?
【解决方案3】:

尝试在 REQUEST_CODE 中使用另一个值。 不要在 REQUEST_CODE 中使用默认值 0

否则您的 pendingIntent 将重新启动您的活动。

如果要使用正常的活动周期,请在创建 PendingIntent 时输入请求值。

PendingIntent resultPendingIntent = PendingIntent.getActivity(
        context, REQUEST_CODE,
        resultIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);

【讨论】:

  • "不要在 REQUEST_CODE 中使用默认值 0。否则您的 pendingIntent 将重新启动您的活动。"请分享出处
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多