我有一个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);
}
}
知道为什么会这样吗?
答案 0 :(得分:4)
这实际上是Android操作系统的一项设计功能,并不是你可以解决的问题。处于“已停止”状态的应用程序无法接收任何广播。只有在这种状态下才有两种情况:
问题是,如果我进入任务管理器并强制关闭应用程序,警报似乎不会消失。这很重要,因为用户可以重新启动手机并终止该应用。
这不完全正确,因为如果设备重新启动,则不认为应用程序处于“停止”状态。但是,警报不会持续重新启动,因此您的应用程序需要在设备启动时监听系统的ACTION_BOOT_COMPLETED
广播,以便您可以重新安排任何待处理的警报。
如果用户主动杀死您的应用,您必须尊重他们的选择。