我在PreferenceFragment中有一个AlarmManager,可以按计划每天启动一次警报。不幸的是,每次关闭应用程序时它都会立即启动警报。切换相关首选项后会发生这种情况,但如果我在主活动上打开应用程序然后再次关闭它,以便从未启动此首选项碎片和相关活动,也会发生这种情况。
我可以看到之前启动的服务仍然在后台运行,所以我最好的猜测是,在停止应用程序后重新启动警报会导致立即警报,我应该使用PendingIntent.FLAG_UPDATE_CURRENT
但我可以'似乎让这个工作。
我也不明白为什么这首先是一个问题。当然使用AlarmManager.INTERVAL_DAY
应该意味着即使重新启动警报,它也不应该至少开火一天?
以下是PreferenceFragment中的代码:
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(KEY_PREF_NOTIFICATION)) {
Intent alarmIntent = new Intent(getActivity(), AlarmReciever.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, 0);
if (sharedPreferences.getBoolean("notification_checkbox", true)) {
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY, AlarmManager.INTERVAL_DAY, pendingIntent);
// turns the boot reciever on
ComponentName receiver = new ComponentName(getActivity(), BootReceiver.class);
PackageManager pm = getActivity().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
Log.e(TAG, "preference changed");
} else {
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
// turns the boot reciever off
ComponentName receiver = new ComponentName(getActivity(), BootReceiver.class);
PackageManager pm = getActivity().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Log.e(TAG, "preference unchanged");
}
}
}
答案 0 :(得分:0)
发现问题。我在服务中使用START_STICKY
而不是START_NOT_STICKY
,这意味着每个应用程序关闭时都会重新启动服务而不是挂起的意图。