通知中恢复先前暂停的活动意图

22

我正在开发一个应用程序,该应用程序向用户显示通知。该通知的目的是使用户在处于其他活动时更容易返回到应用程序。我在我的应用程序中使用此代码来创建和显示通知。

                    notification = new Notification(R.drawable.icon,
                            "Notify",
                            System.currentTimeMillis());
                    notification.setLatestEventInfo(this, "App name",
                            "App message",
                            PendingIntent.getActivity(
                                    this, 0,
                                    new Intent(this, Main.class),
                                    PendingIntent.FLAG_CANCEL_CURRENT));
                    notification.flags |= Notification.FLAG_ONGOING_EVENT;
                    nManager.notify(0, notification);

但是当用户点击通知时,会启动相同活动的新实例,而不是用户之前正在使用的实例。

我认为这与PendingIntent有关,但我找不到如何使Intent恢复先前暂停的活动实例而不是创建新实例。

谢谢。


1
你解决了这个问题吗?我找到的是一个解决方法:所有活动都扩展一个基本活动来存储活动数量(onCreate加1,onDestroy减1),通知启动一个在新任务上运行的虚拟活动,该活动检查正在运行的活动数,如果>0,则只关闭自身,如果==0,则启动第一个活动。 - android developer
5个回答

22

我已经找到了解决方法。我添加了下面的代码:

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

现在我的代码长这样:

    notification = new Notification(R.drawable.icon,
            "Notify", System.currentTimeMillis());
    notification.setLatestEventInfo(this, "App name",
            "App message", PendingIntent.getActivity(this,
                    0, new Intent(this, Main.class)
                            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                                    | Intent.FLAG_ACTIVITY_SINGLE_TOP),
                    PendingIntent.FLAG_CANCEL_CURRENT));
    notification.flags |= Notification.FLAG_ONGOING_EVENT;

Jimix,我尝试了你的代码,但在我的情况下没有起作用,它打开了MainActivity而不是最后一个聚焦的活动。可能我的错误在清单文件中,你是如何设置MainActivity的? - Giuseppe
这些代码应该可以工作。检查同一任务堆栈中的其他活动。它们可能涉及任务顺序。 - Kislingk

9

这对我很有帮助 android:launchMode="singleInstance"

<activity
        android:name="com.mosis.automatskidnevnik.MainActivity"
        android:launchMode="singleInstance"
        android:label="@string/app_name" >
        ...

如果您有多个活动,请避免使用“this”和“singletask”,这只能用于一个活动,但如果需要恢复活动或有一些条件来启动它,则应改用标志。问题在于,如果将来需要更多实例来发送额外的数据,这将阻止您这样做。 - Gastón Saillén

1
我通过设置

解决了相同的问题。
android:launchMode="singleTask"

0
除了@Jimix的正确答案外,我会像另一个答案中评论的那样,将PendingIntent requestCode从0更改为非零值。另一方面,在之前的Android版本中存在一个已知的错误,让我绝望了几个小时。在发送通知之前取消PendingIntent的解决方案对我很有效:

if (Build.VERSION.SDK_INT == 19) {
   getNotificationPendingIntent().cancel();
}

0

1
我尝试在PendingIntent中使用"default context"和"this",但是它没有起作用。 - Jimix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接