使用以下代码,当应用程序被手动终止(模拟操作系统随意杀死应用程序)时,AlarmReceiver.onReceive()
不会被调用。
我必须做什么才能在操作系统杀死后继续使用AlarmReceiver?
清单:
<receiver
android:name="abc.def.AlarmReceiver"
android:enabled="true"
android:exported="false"
/>
AlarmReceiver:
public class AlarmReceiver extends BroadcastReceiver {
public void setupAlarm(Context context, int intervalMS) {
this.interval = interval;
Calendar updateTime = Calendar.getInstance();
updateTime.add(Calendar.SECOND, 5);
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
PendingIntent recurringDownload = PendingIntent.getBroadcast(context, 123, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), intervalMS, recurringDownload);
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Alarm", "hello world!");
}
}
答案 0 :(得分:0)
当您手动杀死它时,您将应用程序置于强制停止状态。这将停止所有接收器和服务,直到您再次手动启动它。这与被操作系统杀死的情况不同。
答案 1 :(得分:0)
正常进程终止(通过OS)不会取消计划的AlarmManager事件。因此,在操作系统终止进程后,警报仍然有效。
如果您手动强制关闭应用程序,则会取消注册您的警报。而且,在Android 3.1+上,您必须手动启动其中一个活动才能再次注册它们。 因此,通过手动终止应用程序,您并没有完全模拟杀死应用程序的操作系统
答案 2 :(得分:0)
android:exported="false"
表示您不允许您的应用从系统接收任何事件。将其更改为true
还有一件事,请务必在setupAlarm
Context
来自谷歌的文档
广播接收器是否可以从其应用程序之外的来源接收消息 - 如果可以,则为“true”,否则为“false”。如果为“假”,则广播接收器可以接收的唯一消息是由相同应用程序的组件或具有相同用户ID的应用程序发送的消息。 默认值取决于广播接收器是否包含意图过滤器。缺少任何过滤器意味着只能由指定其确切类名的Intent对象调用它。这意味着接收器仅供应用程序内部使用(因为其他人通常不知道类名)。所以在这种情况下,默认值为“false”。另一方面,至少一个过滤器的存在意味着广播接收器旨在接收由系统或其他应用程序广播的意图,因此默认值为“true”。
此属性不是限制广播接收器外部曝光的唯一方法。您还可以使用权限来限制可以向其发送消息的外部实体(请参阅权限属性)。
答案 3 :(得分:0)
所有都是相应的,但在代码中可能没有在 onRecieve()中调用 setupAlarm()方法。
public class AlarmReceiver extends BroadcastReceiver {
public void setupAlarm(Context context, int intervalMS) {
this.interval = interval;
Calendar updateTime = Calendar.getInstance();
updateTime.add(Calendar.SECOND, 5);
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
PendingIntent recurringDownload = PendingIntent.getBroadcast(context, 123, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), intervalMS, recurringDownload);
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Alarm", "hello world!");
setupAlarm(context,2000);//May be this line is missing.
}
}