应用程序重新启动后,AlarmManager不会停止

时间:2014-10-25 17:08:49

标签: android alarmmanager

我已经实施了警报管理器,就像它在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语句,应用程序崩溃。

但是为什么这可能适用于示例应用但不适用于我的应用?

2 个答案:

答案 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问题。

相关问题