代码之家  ›  专栏  ›  技术社区  ›  pgsandstrom

通过通知启动活动:避免重复活动

  •  27
  • pgsandstrom  · 技术社区  · 14 年前

    所以我现在正在显示一个通知。当用户单击此通知时,应用程序启动。通知将持续,以指示服务正在后台运行。

    Intent notificationIntent = new Intent(context, LaunchActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
    mNotificationManager.notify(1, notification);
    

    但是,我检测到一个错误出现的情况。如果用户通过单击“正常”图标启动应用程序,并且在活动运行时单击通知,则新活动将在不退出前一个活动的情况下启动,而退出后一个活动将在前一个活动的基础上启动。这并不是全部:进一步点击通知将创建额外的活动,并将它们放在已经运行的活动之上。我该如何预防?是否有一个很好的检查来查看某个活动当前是否正在显示或已加载?

    3 回复  |  直到 7 年前
        1
  •  37
  •   Vadim Kotov First Zero    7 年前

    这就是默认情况下的做法。您可能需要指定 android:launchMode="singleTop" 如果您只想拥有一个实例。
    有4种启动模式,更多信息如下: https://developer.android.com/guide/topics/manifest/activity-element.html

        2
  •  10
  •   CopsOnRoad    7 年前

    当使用 lanchMode="singleTask" ,如果您的活动实例已经存在,Android不会重新创建该活动,而是使用 onNewIntent() 方法。

    如Android文件所述:

    系统在新任务的根目录下创建活动,并将意图路由到该活动。但是,如果活动的实例已经存在,系统会通过调用其onNewIntent()方法将意向路由到现有实例,而不是创建新实例。

    Android documentation for activity mode

        3
  •  2
  •   TheIT    11 年前

    正如上面提到的两个答案,您将希望设置应用程序的启动模式,该模式在清单中的活动定义中定义:

    <activity
        android:name="com.company.ActivityName"
        android:launchMode="singleTask">
    </activity>
    

    此外,您可能需要注意,尽管标记“活动”或“单实例”是一个有效的意图标志,但对于单任务或单实例,没有等效的意图标志。

    有关不同启动模式选项的详细信息,请参阅LaunchMode部分: http://developer.android.com/guide/topics/manifest/activity-element.html#lmode