Как сохранить запланированный сигнал тревоги после того, как приложение было убито Android или убийцей задач? - PullRequest
22 голосов
/ 07 мая 2011

Код, который планирует тревогу.

    PendingIntent sender = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, time, sender);

Работает нормально, но когда я убиваю свое приложение в Task Killer, я теряю запланированный будильник. Как решить эту проблему?

Ответы [ 2 ]

20 голосов
/ 07 мая 2011

ваше приложение передает сообщение, поскольку оно уничтожается, и, когда это сообщение передается, тогда прослушиватель должен проверить, работает ли еще служба ... если она не запущена. Это обеспечит работу вашего сервиса, даже если приложение убито.

Обновление

Я постараюсь создать для вас блок-схему

Death/Restart of a service

Метод onDestroy () является частью службы.

Надеюсь, это поможет.

ОБНОВЛЕНИЕ 2

Одна вещь, которую я забыл упомянуть, это то, что в идеале вы хотите, чтобы запускался только один экземпляр службы. Так что просто посмотрите на идентификатор, который присутствует в onStart (), должно быть от == до 1, чтобы запустить его еще .. игнорируйте его.

Методы уведомления Класс обслуживания :

onStart (): этот метод вызывается при запуске службы

onDestroy (): это метод, который вызывается при уничтожении службы

Методы уведомления класса BroadcastReciever :

onReceive (): этот метод получает все отправленные ему намерения (если не отфильтрованы)

Просмотрите примеры BroadcastRecievers (передача сообщений) и Service (запуск службы)

Ссылки:

http://developer.android.com/reference/android/content/BroadcastReceiver.html

http://developer.android.com/reference/android/app/Service.html

6 голосов
/ 18 августа 2017

Тревога, установленная диспетчером тревог, не прерывается при закрытии приложения, однако, когда происходит перезагрузка, все тревоги очищаются операционной системой, так как нет постоянства.Поэтому вам нужно выполнить постоянство.

  • Каждый раз при установке будильника сохраняйте время будильника.
  • Регистрация получателя для завершения загрузки.
  • Снова установите будильник при перезагрузке.

    public class BootReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            //re register the alarm
       }
    }
    

Manifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
.......
<receiver
      android:name="BootReceiver"
        android:enabled="true"
        android:exported="true"
        >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

Вы можете использовать SharedPreference , чтобы сэкономить время (времяв тот момент, когда должен быть активирован сигнал тревоги, или в тот момент, когда он должен быть активирован в следующий раз)

Используйте это для установки нового сигнала тревоги на загрузочном приемнике.

...