仅在应用程序运行时收到警报

时间:2012-08-28 21:07:06

标签: android service alarmmanager

我有一个Android应用程序,允许用户添加一个警报,记录他们的位置。例如,每天早上8点我想记录我的位置。收到警报后,它会启动获取用户位置的服务并将其保存到数据库。应用程序运行时(在后台或前台),此功能正常工作。

问题是,如果我进入任务管理器并强制关闭应用程序,警报似乎不会消失。这很重要,因为用户可以重新启动手机并终止该应用。

以下是设置闹钟的方法:

private void setNewAlarm(int hour, int minute, int id) {
    Intent alarmIntent = new Intent(AutoLoggerActivity.this, AlarmReciever.class);
    alarmIntent.putExtra(Constants.ALARMID_FIELD_NAME, id);
    PendingIntent sender = PendingIntent.getBroadcast(AutoLoggerActivity.this, id, alarmIntent, 0);

    Calendar alarmCal = Calendar.getInstance();
    alarmCal.set(Calendar.HOUR_OF_DAY, hour); // set user selection
    alarmCal.set(Calendar.MINUTE, minute); // set user selection
    alarmCal.set(Calendar.SECOND, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmCal.getTimeInMillis(), 120000, sender);
}

这是BroadcastReceiver:

public class AlarmReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();     
        int alarmId = bundle.getInt(Constants.ALARMID_FIELD_NAME);
        Toast.makeText(context, "Alarm Running: ID = " + alarmId, Toast.LENGTH_LONG).show();
        Log.d(TAG, "AlarmReceiver: onRecieve. ID = " + alarmId);

        Intent serviceIntent = new Intent(context, LocationRecordingService.class);
        serviceIntent.putExtra(Constants.ALARMID_FIELD_NAME, alarmId);
        context.startService(serviceIntent);
    }
}

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

这实际上是Android操作系统的一项设计功能,并不是你可以解决的问题。处于“已停止”状态的应用程序无法接收任何广播。只有在这种状态下才有两种情况:

  1. 首次安装应用程序之前,
  2. 当用户主动进入“设置”并强行关闭时
  3.   

    问题是,如果我进入任务管理器并强制关闭应用程序,警报似乎不会消失。这很重要,因为用户可以重新启动手机并终止该应用。

    这不完全正确,因为如果设备重新启动,则不认为应用程序处于“停止”状态。但是,警报不会持续重新启动,因此您的应用程序需要在设备启动时监听系统的ACTION_BOOT_COMPLETED广播,以便您可以重新安排任何待处理的警报。

    如果用户主动杀死您的应用,您必须尊重他们的选择。