android - 单击通知后返回当前正在运行的 Activity

标签 android android-intent android-activity android-notifications android-pendingintent

我有以下问题: 我编写了一个 Android 服务 - 一个音乐播放器 - 它在后台运行并在启动时发出通知。单击此通知将打开 Activity A,允许与该玩家交互。这工作得很好。

问题是当我运行第三方 Activity (例如网络浏览器)并且单击通知时。单击此按钮会将我带到 Activity A,但单击“后退”按钮(这就是问题所在)会将我带到主屏幕。相反,我想 恢复之前运行的 Activity ,即网络浏览器。

有人知道怎么做吗?

    private void initNotification(){

    Intent resultIntent = new Intent(this, AudioPlayerActivity.class);
    //resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(AudioPlayerActivity.class);
    stackBuilder.addNextIntent(resultIntent);

    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    stackBuilder.getIntents();

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
    mBuilder.setSmallIcon(...);
    mBuilder.setContentTitle("...");
    mBuilder.setContentText("...");
    mBuilder.setContentIntent(resultPendingIntent);


    // create a notification manager that then displays the notification
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

最佳答案

您的问题是使用TaskStackBuilder。不幸的是,此类对您希望如何管理应用程序做出了很多假设。当您使用 TaskStackBuilder 构造 PendingIntent 堆栈时,它会将以下标志添加到“根”Intent:

 intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
            Intent.FLAG_ACTIVITY_CLEAR_TASK |
            Intent.FLAG_ACTIVITY_TASK_ON_HOME);

(注意:此代码 fragment 来自 Android 4.1.1 中 TaskStackBuilder 的源代码)

由于设置了 Intent.FLAG_ACTIVITY_TASK_ON_HOME,它会在主屏幕顶部启动您的任务,而不是在用户当前任务之上启动它。

如果您可以避免使用TaskStackBuilder,则可以解决此问题。如果您确实需要构建 Activity 堆栈,可以使用 PendingIntent.getActivities(),您可以在其中控制每个 Intent 中设置哪些标志。否则,只需使用 PendingIntent.getActivity() 创建您放入 Notification 中的 PendingIntent


注意:编辑以添加示例代码

试试这个:

private void initNotification(){
    Intent resultIntent = new Intent(this, AudioPlayerActivity.class);
    resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
    mBuilder.setSmallIcon(...);
    mBuilder.setContentTitle("...");
    mBuilder.setContentText("...");
    mBuilder.setContentIntent(resultPendingIntent);
    // create a notification manager that then displays the notification
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

关于android - 单击通知后返回当前正在运行的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30874000/

相关文章:

Android API 32 未找到源

android - 如何为我的 Android Market APK 创建证书?

android - 如何通过 ADB shell 广播带有附加功能的 Intent ?

java - Activity 之间的值(value)转移

Android addToBackStack 关闭应用

java - 模块返回 JSONArray 是一个好习惯吗?

java - 在 android studio 中生成签名的 apk 时未找到类型 `libcore.io.Memory`

用于上下音量键的Android BroadCastReceiver

android - 如何使用 Intent 将表情符号和文本从 Activity 传递到下一个

java - 在三个 Activity 之间发送数据