单击通知后返回当前正在运行的活动

Mar*_*tin 2 android android-intent android-notifications android-activity android-pendingintent

我有以下问题:我编写了一个 android 服务 - 一个音乐播放器 - 在后台运行并在启动时启动通知。单击此通知会打开允许与该玩家互动的活动 A。这工作正常。

问题是当我有第三方活动(例如 Web 浏览器)运行时,我单击了通知。此单击将我带到活动 A,但单击“后退”按钮 - 这就是问题 - 将我带到主屏幕。相反,我想恢复以前运行的活动,即 Web 浏览器。

有人知道怎么做吗?

    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());
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 5

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

 intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
            Intent.FLAG_ACTIVITY_CLEAR_TASK |
            Intent.FLAG_ACTIVITY_TASK_ON_HOME);
Run Code Online (Sandbox Code Playgroud)

(注意:此代码片段来自TaskStackBuilderAndroid 4.1.1 中的for 源)

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

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


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

尝试这个:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的信息。以前从未使用过这个标志。 (2认同)