Alarm Manager не будет работать, когда приложение убито в фоновом режиме и устройство заблокировано

android alarmmanager wakelock

4534 просмотра

3 ответа

46 Репутация автора

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

Я хочу использовать диспетчер тревог, чтобы показать уведомление в определенное время, и теперь оно работает в ситуации, указанной ниже:

  1. когда приложение работает в фоновом режиме, уведомление будет отображаться в нужное время, независимо от того, заблокировано устройство или нет.
  2. после того, как приложение было убито в фоновом режиме, я все равно получу правильное уведомление, когда устройство не заблокировано, но когда устройство заблокировано, все идет не так, я не могу получить никакого уведомления.

Вот код AlarmReceiver.java, все необходимые разрешения уже добавлены в AndroidManifest.xml:

@Override
public void onReceive(Context context, Intent intent) {
    WakeLocker.acquire(context);

    String action = intent.getAction();

    Log.d(TAG, action); //when app is killed and device is locked, no info is shown at the logcat

    if (ACTION_ALARM.equals(action)) {
        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(2 * 1000);

        notify(context, "Jello!");
    }

    WakeLocker.release();
}

public static void alarm(Context context) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.setAction(ACTION_ALARM);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5 * 1000, pi);
    } else {
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5 * 1000, pi);
    }
}

private void notify(Context context, String msg) {
    NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, InfoActivity.class), 0);

    Notification notification =
            new NotificationCompat.Builder(context)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(context.getString(R.string.alarm))
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                    .setContentText(msg)
                    .setAutoCancel(true)
                    .setContentIntent(contentIntent).build();

    notificationManager.notify(1, notification);
}

Разрешения добавлены:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
Автор: Guomato Источник Размещён: 18.07.2016 04:57

Ответы (3)


0 плюса

5242 Репутация автора

Однажды у меня возникла похожая проблема, и я нашел решение онлайн, которое включало блокировку телефона при вызове широковещательного приемника. Поэтому попробуйте создать этот класс и вызывать, MyWakeLock.acquire()когда вызывается широковещательный приемник. Вам также следует позвонить, MyWakeLock.release()когда вы закончите выполнять то, что делает ваш будильник.

package your.package.name;

import android.content.Context;
import android.os.PowerManager;

public abstract class MyWakeLock {
    private static PowerManager.WakeLock wakeLock;

    public static void acquire(Context c) {
        if (wakeLock != null) wakeLock.release();

        PowerManager pm = (PowerManager) c.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, MainActivity.APP_TAG);
        wakeLock.acquire();
    }

    public static void release() {
        if (wakeLock != null){
            wakeLock.release();
        }
        wakeLock = null;
    }
}
Автор: Sebastian Breit Размещён: 18.07.2016 05:05

1 плюс

46 Репутация автора

Решение

Я только что нашел решение, установил флаг с именем FLAG_INCLUDE_STOPPED_PACKAGES для намерения тревоги, все будет хорошо. Вот иллюстрация в Android разработчиков

Автор: Guomato Размещён: 21.07.2016 03:18

0 плюса

11 Репутация автора

у меня была эта проблема, и в конце концов я обнаружил, что targetSdkVersion выше 22 и разрешение на обработку не указано. установил targetSdkVersion 22 и работал ^ _ ^

Автор: bootiyar Размещён: 20.12.2018 06:43
Вопросы из категории :
32x32