我有以下问题: 我写了一个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());
}
答案 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中不再有活动,因此它会将您带回主屏幕。