点击通知

时间:2015-06-16 17:13:20

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

我有以下问题: 我写了一个Android服务 - 一个音乐播放器 - 在后台运行并在启动时启动通知。单击此通知将打开允许与此播放器进行交互的活动A.这很好。

问题是当我有第三方活动(例如网络浏览器)运行时,我点击通知。这次点击将我带到活动A,但点击BACK按钮 - 这就是问题 - 将我带到主屏幕。相反,我想 恢复先前运行的活动,即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());
}

2 个答案:

答案 0 :(得分:2)

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

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

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

Intent.FLAG_ACTIVITY_TASK_ON_HOME设置后,它会在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());
}

答案 1 :(得分:0)

我认为你不需要处理它。这取决于已经运行的应用程序。

我刚试了两次通知。在第一种情况下,whatsapp正在运行,然后打开通知并按下后退按钮我被带回whatsapp。在第二种情况下,我运行了chrome,在点击通知并返回时,我被带回主屏幕。

在第二种情况下,chrome可能会在其当前活动上调用finish(),该活动会被破坏,并且在Backstack中不再有活动,因此它会将您带回主屏幕。