应用程序停止时的android本地通知

时间:2015-01-04 19:34:04

标签: android android-intent notifications broadcastreceiver

我已经跟踪了来自SO的some tutorials,在我的应用关闭后的某个时间使用AlertManager通过广播到我的自定义BroadcastReceiver impl来生成本地通知。它运行良好,我可以看到通知在设备的通知区域中出现。

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

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

     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(context,intent):

    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();
        }       

1 个答案:

答案 0 :(得分:0)

总结一下,Force关闭你的应用意味着用户明确地说他 不想再运行你的应用了

从3.1开始安装应用程序时,它们处于“已停止”状态,因此在用户显式启动它们之前它们将无法运行。按下强制停止将使它们返回到此状态,因此,如果用户强制停止您的应用程序,则应用程序的所有组件(BroadcastReceivers,Services,AlarmManager ...)将不再再次工作,直到用户再次手动运行您的应用程序。 3.1版本说明here中记录了这一点。

虽然AlarmManager的文档说明了

  

注意:警报管理器适用于您想要的情况   即使您的应用程序,您的应用程序代码也会在特定时间运行   目前没有运行。对于正常的计时操作(刻度,   超时等)使用Handler更容易,效率更高。

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

Android框架开发人员https://groups.google.com/forum/?fromgroups=#!topic/android-developers/anUoem0qrxU

确认了此行为