从通知中恢复活动

时间:2010-03-05 12:11:28

标签: java android android-activity notifications

我的应用状态栏中有通知:

    Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis());

    Intent notificationIntent = new Intent(this.parent, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0);

    ...

    notification.flags = Notification.FLAG_ONGOING_EVENT;        
    mNotificationManager.notify(NOTIFICATION_ID, notification);

问题在于,当您从应用程序按下主页按钮(将其推到后台)时,按下从状态栏访问的列表中的通知,它会启动活动的新副本。我想要做的就是恢复应用程序(比如当你长按主页按钮并按下应用程序的图标时)。有没有办法创建一个Intent来做到这一点?

7 个答案:

答案 0 :(得分:31)

我已经通过在androidManifest.xml文件中将我的活动的launchMode更改为singleTask来解决了这个问题。

此属性的默认值为standard,允许运行任意数量的实例。

  

“singleTask”和“singleInstance”活动只能开始一项任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例 - 只有一个这样的任务。 [...]

     

“singleTask”和“singleInstance”模式在一个方面也各不相同:“singleTask”活动允许其他活动成为其任务的一部分。它始终是其任务的根源,但其他活动(必然是“标准”和“单一活动”)可以启动到该任务中。另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中唯一的活动。如果它启动另一个活动,则该活动将分配给另一个任务 - 就像FLAG_ACTIVITY_NEW_TASK在意图中一样。

您可以在Android Developers' Guide

中找到详细说明

我希望这会有所帮助

答案 1 :(得分:1)

我遇到了类似的问题,处理这个问题的正确方法是使用标志:Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP就像这样

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

从文档中可以看出:

FLAG_ACTIVITY_CLEAR_TOP

  

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。

FLAG_ACTIVITY_SINGLE_TOP

  

如果设置,如果活动已经在历史堆栈的顶部运行,则不会启动该活动。

答案 2 :(得分:0)

我刚刚找到了解决这个问题的方法:我创建了 getPreviousIntent 方法并将其提供给PendingIntent:

private Intent getPreviousIntent(Intent newIntent) {
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0);
    String myPkgNm = getPackageName();

    if (!recentTaskInfos.isEmpty()) {
        ActivityManager.RecentTaskInfo recentTaskInfo;
        for (int i = 0; i < recentTaskInfos.size(); i++) {
            recentTaskInfo = recentTaskInfos.get(i);
            if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) {
                newIntent = recentTaskInfo.baseIntent;
                newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
        }
    }
    return newIntent;
}

答案 3 :(得分:0)

将此行添加到应用清单文件中的相应活动。

android:launchMode="singleTask"

例如:

<activity
    android:name=".Main_Activity"
    android:label="@string/title_main_activity"
    android:theme="@style/AppTheme.NoActionBar"
    android:launchMode="singleTask" />

答案 4 :(得分:0)

我的设备之间的行为不一致,有些意图使额外功能失去了,并且调用了MainActivity的 OnNewIntent onCreate 方法。

什么不起作用

清单:

    <activity android:name=".MainActivity"
        android:launchMode="singleTask">

服务:

    Intent notificationIntent = new Intent(this.getBaseContext(), MainActivity.class);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    notificationIntent.putExtra("TEST", 1);

可以做什么

清单:

    <activity android:name=".MainActivity"
        android:launchMode="singleTask">

服务:

    PackageManager pm = getPackageManager();
    Intent launchIntent = m.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID);
    launchIntent.putExtra("TEST", 2);

答案 5 :(得分:0)

您可以模拟启动意图(就像用户单击您的应用程序图标以启动它一样):

val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName)

val contentIntent = PendingIntent.getActivity(context, 0, launchIntent, 0)

这样,您不必不必在清单中将您的应用标记为“ singleTask”或“ singleInstance”(这会产生其他问题)。因此,这应该是正确的解决方案。

注意,但是,由于涉嫌存在android错误,上述解决方案可能无法直接为您服务。可以在in this question中找到有关android bug和解决方法的讨论。

答案 6 :(得分:-1)

我用:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.setAction(Intent.ACTION_MAIN);

不确定这些是您需要设置的值,但答案是在那些方法/标志中。