我的Android应用程序包含一个Activity,其中包含使用标签访问的两个片段(我使用ViewPager)。
在片段#2中,通过按钮创建通知。例如,如果用户使用主页按钮将应用程序发送到后台,此按钮将启动后台任务,该任务需要继续。
我希望用户能够在点击通知时将应用程序恢复到前面,就像使用了应用程序图标一样。这是我的代码:
Notification.Builder mBuilder =
new Notification.Builder(getActivity())
.setSmallIcon(R.drawable.ic_stat_av_play)
.setContentTitle("MyApp")
.setContentText("A background task is running");
Intent notificationIntent = new Intent(getActivity(), MainActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(
getActivity(), 0, notificationIntent, 0);
mBuilder.setContentIntent(notificationPendingIntent);
mNotificationManager = (NotificationManager) getActivity().getSystemService(
Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());
不幸的是,点击通知会关闭当前正在运行的应用程序并再次启动它。
正如您所看到的,我尝试了此处提出的解决方案:Resume application and stack from notification,但它不起作用。许多类似的问题也建议使用这些标志中的一个或多个:
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_REORDER_TO_FRONT
我发现这些都不会对我的通知行为产生任何影响。是否有一些我缺少的东西让这项工作按预期进行?
修改:
也许这会帮助你帮助我。问题似乎来自应用程序结构。
如果我更换此行:
Intent notificationIntent = new Intent(getActivity(), MainActivity.class);
这一个:
Intent notificationIntent = new Intent(getActivity(), Fragment2.class);
如果在应用程序仍处于前台时单击它,通知行为将是正确的(即通知抽屉将自行关闭)但是,如果我使用主页按钮返回主屏幕,然后单击通知什么都没发生。
如果我使用第一个intent定义(使用MainActivity.class),则没有任何标志对intent有任何影响。这也适用于清单中定义的launchMode。
修改2
添加了解决方案。我不太确定它为什么会起作用,所以任何额外的输入都会受到赞赏!
答案 0 :(得分:1)
我使用此方法并解决了问题。希望这也可以帮到你。
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
答案 1 :(得分:0)
你能试试吗,
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
在你的清单中,
android:launchMode="singleTask"
用于您的MainActivity。
答案 2 :(得分:0)
所以,我终于成功了!这是最终的代码,我希望它能帮助处于类似情况的其他人。
mBuilder =
new Notification.Builder(getActivity())
.setSmallIcon(R.drawable.ic_stat_av_play)
.setContentTitle("MyApp")
.setContentText("A background task is running.")
.setOngoing(true);
notificationIntent = new Intent(Intent.ACTION_MAIN);
notificationIntent.setClass(getActivity().getApplicationContext(), MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
notificationPendingIntent = PendingIntent.getActivity(getActivity(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(notificationPendingIntent);
mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());
我还必须在清单中设置此launchMode:
android:launchMode="singleTop"
答案 3 :(得分:0)
你可以尝试一下,也许可以帮助你!
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);