Подтвердить что ты не робот

Android AlarmManager останавливается, когда активность умирает

Я запускаю AlarmManager с PendingIntent и на нескольких телефонах. Тревога не отвечает. На некоторых устройствах работает нормально на других, это терпит неудачу. Я провел несколько тестов на разных телефонах.

Nexus работает нормально, также Samsung Galaxy S4 zoom (4.2) работает нормально.

Samsung примечание 2 (4.3) работает нормально.

Индикатор аварийной сигнализации OPPO (4.4.4).

Я также реализовал широковещательные приемники, которые работают так, как должны, на всех устройствах.

    Log.v(TAG, "START ALARM");

    Intent intentAlarm = new Intent(context, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent);
4b9b3361

Ответ 1

Проверьте, находится ли приложение в состоянии остановки. Когда приложение находится в состоянии остановки, он не получит никаких сигналов тревоги или событий.

Кроме того, я думаю, что это может быть проблема с прошивкой/ОС для OEM/производителя. Чтобы проверить, действительно ли будильник использует расписание adb shell dumpsys alarm, и проверьте, действительно ли был установлен ваш будильник приложения.

Чтобы проверить, находится ли он в состоянии остановки, используйте следующую команду:

adb shell dumpsys package "com.package.name" и проверьте   "остановился = истина"

Чтобы узнать больше о состоянии остановленного состояния, выполните следующие действия:

Launch controls on stopped applications

Starting from Android 3.1, the system package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications.

Note that an application stopped state is not the same as an Activity stopped state. The system manages those two stopped states separately.

The platform defines two new intent flags that let a sender specify whether the Intent should be allowed to activate components in stopped application.

FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential targets to resolve against.
FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential targets.
When neither or both of these flags is defined in an intent, the default behavior is to include filters of stopped applications in the list of potential targets.

Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stoppped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications.

Applications are in a stopped state when they are first installed but are not yet launched and when they are manually stopped by the user (in Manage Applications).

Обратите внимание, что состояние остановки отличается от того, что процесс приложения не запущен.

Ответ 2

Здесь может быть несколько различных проблем:

  • Тип сигнала, который вы запрашиваете (ELAPSED_REALTIME), не пробудит устройство для доставки тревоги. Вместо этого, если он истекает во время сна, устройство будет доставлено в следующий раз, когда устройство просыпается.
  • Значение triggerAtMillis 1000 запрашивает первый сигнал тревоги через 1 секунду после загрузки устройства. Если устройство уже запущено и вы запрашиваете этот сигнал, первый аварийный сигнал может не срабатывать и может привести к тому, что последующие сообщения не будут назначены. Это просто предположение, я не проверял, глядя на источники 4.4.4 AOSP.

Обработка сигналов тревоги была изменена в API 19 (Android 4.4), чтобы обрабатывать сопоставление таймеров аварийных сигналов (все по умолчанию неточно), и это изменение могло повлиять на ситуацию для 2-го пуля. Вы можете попробовать изменить значение triggerAtMillis как (SystemClock.elapsedRealtime() + 1000)

Обратите внимание: если вам нужно, чтобы устройство проснулось от сна, вам нужно использовать вариант тревоги _WAKEUP, а также включить BroadcastReceiver блокировку слежения, которую отпускают ваши Service или Activity, когда она выполняется обработка сигнала тревоги.

Ответ 3

Это только предположение, но я думаю, что проблема связана с API. Начиная с KitKat, система запускает AlarmManager. Возможно, попробуйте использовать что-то другое для систем на abd выше kitkat.

"Примечание. Начиная с подачи сигнала тревоги API 19 (KITKAT) неточно: ОС сбрасывает аварийные сигналы, чтобы свести к минимуму пробуждения и использование батареи. Существуют новые API-интерфейсы для поддержки приложений, которым требуются строгие гарантии доставки, см. setWindow (int, long, long, PendingIntent) и setExact (int, long, PendingIntent). Приложения, чья targetSdkVersion раньше, чем API 19, будут продолжать видеть предыдущее поведение, при котором все тревоги доставляются точно по запросу."

Взято из http://developer.android.com/reference/android/app/AlarmManager.html

Ответ 4

Попробуйте следующее:

1) Добавьте в свой манифест разрешение Wake_lock.

<uses-permission android:name="android.permission.WAKE_LOCK">

2) Измените

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent);

с

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000, 5000, pendingIntent);

Ответ 5

Не могли бы вы показать нам код AlarmReceiver.class? Может быть, вам нужно использовать return START_STICKY; для вашего метода onStartCommand?

Ответ 6

Попробуйте разместить AlarmManager в фоновом режиме.

Ответ 7

Ваши тревоги будут продолжать существовать после того, как ваше приложение будет закрыто нормально. Если это принудительно остановлено или ваше устройство перезагружено или обновление для вашего приложения установлено, или ваше приложение будет удалено, они будут потеряны. Вы можете создать BroadcastReceivers для некоторых из этих ситуаций, чтобы воссоздать ваши тревоги.

Кроме того, setInexactRepeating - это то, что: неточно. Когда эта тревога срабатывает, зависит от реализации и не может быть точно предсказана.

Ответ 8

Try this it works when activity is not running..

        Calendar calendar = Calendar.getInstance();

        long timemills = calendar.getTimeInMillis();
        Intent myIntent = new Intent(this, TimeChangeReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

            alarmManager.set(AlarmManager.RTC, timemills, pendingIntent);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timemills,
                    10000, pendingIntent);

Ответ 9

Я также использовал Alarm Service в своем проекте для подготовки к работе в течение 6 или 7 минут. И он работает нормально во всех телефонах.

У меня есть будильник Службу вроде этого:

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;

public class MyAlarmService {
    private static PendingIntent resetAlarm;
    private static String TAG="CellPoliceChildGPSAlarmService";
    private static AlarmManager am;
    public static void start(Context context) {
        try {
            // We want the alarm to go off 30 seconds from now.
            long firstTime = SystemClock.elapsedRealtime();

            // Create an IntentSender that will launch our service, to     be scheduled with the alarm manager.
            //resetAlarm = PendingIntent.getService(context, 0, new     Intent(context, Get_NonRootDetails.class), 0);
            resetAlarm = PendingIntent.getService(context, 0, new     Intent(context, CallNonRBackgroundService.class), 0);
            // Schedule the alarm!
            am = (AlarmManager)     context.getSystemService(Context.ALARM_SERVICE);
            Log.i(TAG, firstTime+"");
            am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,     firstTime, 10*1000*60, resetAlarm);
        } 
        catch (Exception e) {
            Log.v("CellInfo", "Exception while start the     MyAlarmService at: " + e.getMessage());
        } 
    }

    public static void stop(Context context) {
        try {
            // When interval going to change from web services
            am.cancel(resetAlarm);
        } 
        catch (Exception e) {
            Log.v("CellInfo", "Exception while start the     MyAlarmService at: " + e.getMessage());
        }
    }


}

Я позвонил или начал так:

MyAlarmService.start(SplashActivity.this);

Предоставлено разрешение в манифесте:

<uses-permission android:name="android.permission.WAKE_LOCK">

    <service
            android:name="com.secure.DataCountService"
            android:enabled="true" >
            <intent-filter>
                <action     android:name="com.secure.MyService" />
            </intent-filter>
        </service>

Для уведомлений я также использовал ожидающие намерения, такие как:

    Intent notificationIntent = new Intent(context, DashBoardActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(context,     0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle,     PushNotificationUtils.notiMsg, pendingIntent);
        notification.flags  |=  notification.FLAG_AUTO_CANCEL;