Android:通过Viewpager将Activity带到前面的通知

时间:2014-05-14 00:09:44

标签: android android-fragments notifications

我的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

添加了解决方案。我不太确定它为什么会起作用,所以任何额外的输入都会受到赞赏!

4 个答案:

答案 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);