我已经跟踪了来自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();
}
答案 0 :(得分:0)
总结一下,Force关闭你的应用意味着用户明确地说他 不想再运行你的应用了
从3.1开始安装应用程序时,它们处于“已停止”状态,因此在用户显式启动它们之前它们将无法运行。按下强制停止将使它们返回到此状态,因此,如果用户强制停止您的应用程序,则应用程序的所有组件(BroadcastReceivers,Services,AlarmManager ...)将不再再次工作,直到用户再次手动运行您的应用程序。 3.1版本说明here中记录了这一点。
虽然AlarmManager
的文档说明了
注意:警报管理器适用于您想要的情况 即使您的应用程序,您的应用程序代码也会在特定时间运行 目前没有运行。对于正常的计时操作(刻度, 超时等)使用Handler更容易,效率更高。
在您的应用程序强制关闭后它也不会起作用,这不是一个错误,它是一个功能。
Android框架开发人员https://groups.google.com/forum/?fromgroups=#!topic/android-developers/anUoem0qrxU
确认了此行为