应用程序关闭后,AlarmManager立即触发

时间:2015-11-04 22:22:38

标签: android alarmmanager android-alarms

我在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");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

发现问题。我在服务中使用START_STICKY而不是START_NOT_STICKY,这意味着每个应用程序关闭时都会重新启动服务而不是挂起的意图。