1

我有一个 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);
}

这是广播接收器:

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);
    }
}

知道为什么会这样吗?

4

1 回答 1

4

这其实是安卓操作系统的设计特点,不是你能规避的。处于“停止”状态的应用程序无法接收任何广播。只有在两种情况下才处于这种状态:

  1. 当应用程序在启动之前首次安装时
  2. 当用户主动进入设置并强制关闭时

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

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

如果用户主动终止您的应用程序,您必须尊重他们的选择。

于 2012-08-28T21:11:57.937 回答