Будильник не работает, когда приложение закрыто

Будильник работает нормально, когда я работаю с эмулятором. Но не работает, когда я пытаюсь на реальных устройствах.

Вывод, когда приложение открыто.

RTC #8: Alarm{2c1fc9e type 1 when 1486492260454 user.com.hlthee}
    tag=*alarm*:user.com.hlthee/.UpdateTables
    type=1 whenElapsed=+22h43m2s644ms when=2017-02-08 00:01:00
    window=-1 repeatInterval=86400000 count=0
    operation=PendingIntent{7c4e37f: PendingIntentRecord{3f5fbf4c user.com.hlthee broadcastIntent}}

Но когда я закрыл приложение, то эту запись удалили. Почему?? Вот почему будильник не звонит.

Файл манифеста приемника вещателя.

   <receiver android:name=".UpdateTables"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

Пожалуйста, не говорите использовать сервис и зарегистрируйте получателя там. Я думаю, что я регистрирую получателя в манифесте, он будет работать. А также сигнал тревоги в работе нормально в эмуляторе. Не удалось решить эту проблему за последние 3 дня. Любая помощь будет полезна.

Я попробовал этот метод также:

  1. использование wakefullBroadcastReceiver вместо BroadcastReceiver
  2. используйте setAlarmclock вместо setExact.

Любой, кто сталкивается с той же проблемой.

3 ответа

Решение

Реализуем onTaskRemoved и onDestroy

@Override
public void onTaskRemoved(Intent rootIntent) {
    //Set what to do when task is removed
    super.onTaskRemoved(rootIntent);
}

@Override
public void onDestroy() {
    //What to do when service i destroyed
    super.onDestroy();
}

Если вы работаете на устройстве MI, вам нужно выполнить некоторые настройки. Зайдите в Безопасность / Разрешение / Автозапуск / Затем выберите ваше приложение и включите его. Надеюсь, это сработает.

Ваша проблема не объяснена должным образом, если вы устанавливаете диспетчер сигналов тревоги с этим намерением, и ваше приложение принудительно остановлено, установите: FLAG_INCLUDE_STOPPED_PACKAGES в качестве флага в вашем намерении...If set, this intent will always match any components in packages that are currently stopped. This is the default behavior when FLAG_EXCLUDE_STOPPED_PACKAGES is not set. If both of these flags are set, this one wins (it allows overriding of exclude for places where the framework may automatically set the exclude flag).

Если ваша проблема в том, что вы не получаете BOOT_COMPLETED, я предлагаю следующее:

Первое: в свойствах вашего проекта на вкладке Manifest есть список флажков для выбора разрешений, которые вы хотите предоставить, одним из которых является RECEIVE_BOOT_COMPLETED. Проверьте это, чтобы предоставить эти разрешения.

Второе: если ваше приложение установлено на внешнее хранилище (SD-карту), вы никогда не получите действие Boot Complete. Поэтому вы должны указать android:installLocation="internalOnly" в теге manifest.

Третье: начиная с версии Android 3.1+ вы не получите BOOT_COMPLETE, если пользователь никогда не запускал ваше приложение или пользователь "принудительно закрывал" приложение. Это было сделано для того, чтобы вредоносная программа автоматически не регистрировала сервис. Эта дыра в безопасности была закрыта в новых версиях Android.

В-четвертых: откройте на своем устройстве оболочку adb и принудительно проверьте следующее событие: am broadcast -a android.intent.action.BOOT_COMPLETED

Другие вопросы по тегам