我已经实施了警报管理器,就像它在Google示例应用程序中实现一样。一切正常,除非我重新启动应用程序,警报管理器不再停止。
AlarmReceiver.class
public class AlarmReceiver extends WakefulBroadcastReceiver {
AlarmManager alarmManager;
PendingIntent alarmIntent;
@Override
public void onReceive(Context context, Intent intent) {
// do stuff here
}
public void setAlarm(Context context)
{
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, AlarmReceiver.class), 0);
// Fire alarm every 30min
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
5000,
5000,
alarmIntent);
// Restart alarm if device is rebooted
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
public void cancelAlarm(Context context)
{
if (alarmManager != null)
{
alarmManager.cancel(alarmIntent);
}
// Disable BootReceiver so that alarm won't start again if device is rebooted
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
所以这就是问题所在。当我第一次运行应用程序并启动AlarmManager时,我可以轻松地阻止它。但是一旦我关闭应用程序并再次运行它,AlarmManager就不能再停止了。当我完全按下停止按钮时没有任何反应。
我几乎100%确定原因是因为应用程序重启后AlarmManager为空。但如果我删除if语句,应用程序崩溃。
但是为什么这可能适用于示例应用但不适用于我的应用?
答案 0 :(得分:2)
我通过更改cancelAlarm方法解决了我的问题:
public void cancelAlarm(Context context)
{
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, AlarmReceiver.class), 0);
alarmManager.cancel(alarmIntent);
// Disable BootReceiver so that alarm won't start again if device is rebooted
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
答案 1 :(得分:0)
完全按下停止按钮后没有任何反应。
问题代码中没有“停止按钮”。
我几乎100%确定原因是因为应用程序重启后AlarmManager为空
我不知道“应用程序重启”意味着什么。
但您正在使用WakefulBroadcastReceiver
。清单注册BroadcastReceiver
上的数据成员是严重的代码味道。这样一个BroadcastReceiver
的实例将仅用于onReceive()
的一次调用。下一个广播将创建一个新实例,依此类推。因此,onReceive()
结束后,这些数据成员将无用。
因此,我强烈建议您删除:
AlarmManager alarmManager;
PendingIntent alarmIntent;
这应该可以解决您的AlarmManager
- 是 - null
问题。