android 应用停止时的本地通知

android Local notification while app is stopped

我已经按照 some tutorials 从 SO 开始使用 AlertManager 在我的应用程序关闭后通过广播到我的自定义 BroadcastReceiver impl 生成本地通知。效果很好,我可以在设备的通知区域看到通知。

但是,它仅在应用程序的主 activity 暂停时有效。如果应用程序停止(通过设置->应用程序),则没有通知,广播接收器永远不会被调用。我的印象是 AlertManager 在某些 OS 服务中注册了我的通知请求 - 与我的应用程序无关,这就是重点,以便用户可以通过某种通知重新启动我的应用程序。我正在测试 Android 4.2.1 BTW。有没有可能我只是做错了什么,实际上有办法让 AlertManager 成功广播一些东西?

这是我的 AlertManager 代码,从我的主要 activity 的 onPause 调用(设置为 10 秒,仅用于测试)。 'ctx'为主activity

     Calendar cal = Calendar.getInstance();
     cal.add(Calendar.SECOND, 10);
     Intent intent = new Intent(ctx, MyAlarmReceiver.class);
     intent.putExtra("alarm_message", "hey, wake up this app!");
     // note: 192837 is just some test ID:
     PendingIntent sender = PendingIntent.getBroadcast(ctx, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
     // Get the AlarmManager service
     AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
     am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);        

这里是 MyAlarmReceiver.onReceive(上下文,意图):

    try {
         Bundle bundle = intent.getExtras();
         String message = bundle.getString("alarm_message");
         NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("Title!!!")
                    .setContentText(message);
            Intent resultIntent = new Intent(context, MainActivity.class);
            PendingIntent resultPendingIntent =
                    PendingIntent.getActivity(context, 192838, resultIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT);
            mBuilder.setContentIntent(resultPendingIntent);
            NotificationManager mNotificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(123423, mBuilder.build());
        } catch (Exception e) {
         Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
         e.printStackTrace();
        }       

总而言之,强制关闭您的应用意味着用户明确表示他 不想再 运行 你的应用

从 3.1 开始,当安装应用程序时它们处于“停止”状态,因此在用户明确启动它们之前它们将无法 运行。按 Force Stop 将 return 它们进入此状态,因此如果用户强制停止您的应用程序,您应用程序的所有组件(BroadcastReceivers、Services、AlarmManager...)将不再工作,直到用户手动 运行 再次申请。 这在 3.1 发行说明中有记录 here

尽管 AlarmManager 的文档指出

Note: The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running. For normal timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler.

在您的应用程序被强制关闭后它也不会工作,这不是一个错误,而是一个功能。

此行为已由 Android 框架开发人员确认 https://groups.google.com/forum/?fromgroups=#!topic/android-developers/anUoem0qrxU