根据应用程序的状态确定通知点击行为

3

经过长时间的搜索,我没有找到完全符合我需求的东西。

我只是想要:当向用户显示通知时,如果应用程序只是在后台运行,我希望重新打开MainActivity。但是如果应用程序/活动已被终止,我希望完全重启应用程序。

我的实际代码:

   NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.drawable.notification_icon)
                        .setContentTitle(notification.getSubject())
                        .setContentText(notification.getMessage())
                        .setSound(Settings.System.DEFAULT_NOTIFICATION_URI);


        mBuilder.setContentIntent(
                PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class)
                        .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_UPDATE_CURRENT));

        NotificationManager mNotificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification notif = mBuilder.build();
        notif.flags = Notification.DEFAULT_VIBRATE | Notification.FLAG_AUTO_CANCEL;

如果应用程序或活动已被关闭,那么无法工作的情况就是重新启动应用程序。

编辑:我指的是在应用程序管理器中关闭了应用程序。或者我们失去了焦点并销毁了活动。在这些情况下,我想完全重新启动应用程序。


嗯,我不理解为什么人们会投反对票。这通常应该是有效的。也就是说:当通知显示,并且应用程序关闭时,活动(因此应用程序)将自动重新启动。您可能感到困惑的原因是,如果应用程序仍然缓存在内存中,它将不会重新启动。那么,这是您的问题吗? - user458577
1
关于负评:我完全同意@Werner Van Belle的观点。请问应用程序是以何种方式被杀死的:强制停止?从最近使用的应用中滑出?还是只是失去焦点并在某个时候被销毁了? - Bö macht Blau
2个回答

0

我认为你并不完全了解Android的功能。每当需要你的程序时,Android会启动程序(请参阅Application类中的onCreate方法,您可以重写它)。

每当需要一个活动时,它就会被重新创建或带到前台。

这意味着活动重新启动并不一定意味着应用程序重新启动。实际上,如果程序仍然在内存中,则不会发生应用程序重新启动。

如果您想进一步调查此问题:

  1. 创建一个Application.onCreate方法,以便您可以看到您的应用程序是否已重新启动。
  2. 触发通知
  3. 转到Android设置,应用程序选项卡,然后选择“显示缓存进程”。从列表中清除您的进程。
  4. 点击通知。

这应该会触发应用程序的重新启动。如果确实是这个问题,那么您无法“解决”它。Android决定何时杀死您的应用程序以及何时将其从内存中删除。

最好的解决方案是重新设计您的活动,使得无论应用程序何时重新启动,都可以在活动本身中执行相应操作。因此,如果没有更多关于您希望在“活动/应用程序重新启动”时执行哪些功能的详细信息,我们很难进一步提供建议。


是的,这正是我所想的,我只是想知道是否有一种解决方法。在我们的情况下,启动活动会在启动时获取用户配置文件。谢谢您的澄清。 - agonist_
没问题,当我写安卓应用时,我也曾经遇到过这样的困扰。有时候,上一次运行的“旧”状态会出现,并且各种静态变量已经被设置了,而我原本以为它们不会被设置...只有在我理解了上述内容后,我才明白发生了什么。 - user458577
没错… 当你看到 Android 生命周期的甜美模式时,就会觉得“好的,我只需要按正确的顺序做事情”。然后你的应用程序变得越来越复杂,变成一团糟。 - agonist_

0

我认为你需要将setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)的值更改为setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)

原因是由于FLAG_ACTIVITY_REORDER_TO_FRONT的工作方式。当您使用此标志时,Android会从堆栈的前面开始扫描,并一直扫描到堆栈的根/后面,寻找所需活动的实例。一旦找到指定活动的实例,它就会将其置于前台(即如果有多个指定活动的实例,则会将最近的实例置于前台)。

我在这里找到了原始内容。请查看Android开发者文档这里

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接