Вопрос по service, alarmmanager, android – Android: как запланировать событие трансляции аларма, которое будет вызываться, даже если мое приложение закрыто?

2

Мое приложение должно выполнять определенную задачу каждый час. Не имеет значения, запущено ли приложение, приостановлено или даже закрыто.

Когда приложение работает или приостановлено, я могу сделать это, просто запланировав широковещательный приемник AlarmManager. Но когда приложение закрыто, мне нужно вызвать «unregisterReceiver». чтобы не пропустить намерение, и приложение никогда не проснется (или что-то), чтобы обработать задачу.

Тогда возникает вопрос:how to schedule an alarmmanager task that I don't need to unregister, so it will be called even if my application is closed?

Ваш Ответ

2   ответа
3

AlarmManager.setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) за это. Установите типAlarmManager.RTC_WAKEUP чтобы убедиться, что устройство проснулось, если оно спит (если это ваше требование).

Что-то вроде этого:

    Intent intent = new Intent("com.foo.android.MY_TIMER");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
    long now = System.currentTimeMillis();
    long interval = 60 * 60 * 1000; // 1 hour
    manager.setRepeating(AlarmManager.RTC_WAKEUP, now + interval, interval,
        pendingIntent); // Schedule timer for one hour from now and every hour after that

Вы передаете PendingIntent этому методу. Вам не нужно беспокоиться об утечке Intents.

Не забудьте выключить будильник, позвонивAlarmManager.cancel() когда вам это больше не нужно.

Не регистрируйте получателя в коде для этого. Просто добавьте<intent-filter> пометьте запись манифеста для вашего BroadcastReceiver, например так:

    <receiver android:name=".MyReceiver">
        <intent-filter>
            <action
                    android:name="com.foo.android.MY_TIMER"/>
        </intent-filter>
    </receiver>
Вы могли бы просто использоватьAlarmManager.INTERVAL_HOUR за интервал.
Получено не срабатывает, если приложение "принудительно остановлено". Есть ли обходной путь для этого?
На самом деле, нет. Увидетьgroups.google.com/forum/#!topic/android-gcm/MqVlA3Sj26c
0

Service за это. Из сервисного кода вы можете планировать свою задачу, используя AlarmManager с классом PendingIntent для каждого часа. Поскольку ваш AlarmManger объявлен в сервисных компонентах, он не требует никакого графического интерфейса и будет выполняться в фоновом режиме, пока в вашем устройстве не будет батареи.

Похожие вопросы