Android Oreo: широковещательный приемник не работает, если приложение не находится в памяти

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

Я попытался использовать диспетчер аварийных сигналов для достижения этой цели.

Проблема, с которой я столкнулся, заключается в том, что метод onRecieve() моего широковещательного прослушивателя работает нормально, когда приложение находится в памяти, но если я уничтожу приложение (примечание: не принудительно останавливаю, я только удаляю приложение из памяти), onRecieve метод не вызывается.

Из логарифма я вижу, что alarmManager отправляет правильное намерение, но мое приложение по какой-то причине не запускается.

Я просмотрел все возможные ресурсы по этому поводу, и ни один из них, похоже, не решил мою проблему.

Мой манифест:

Разрешения:

    <uses-permission android:name="android.permission.WAKE_LOCK">
    </uses-permission>
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

Получатель намерения в манифесте:

     <receiver android:name=".Alarm">
             <intent-filter>
                 <action android:name="android.intent.action.NOTIFY" />
                 <action android:name="com.myApp.myCustomThing" />
             </intent-filter>
     </receiver>

Мой широковещательный приемник:

public class Alarm extends BroadcastReceiver
{
    Context context;
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.i("Info","Inside OnReceive");
        this.context = context;
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
        wl.acquire();

        Log.i("Info","Alarm called - showing toast");
        // Put here YOUR code.
        Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

        Log.i("Info","Trying to create notification");

        wl.release();
    }

    public void setAlarm(Context context)
    {
        Log.i("Info","In Set Alarm");
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, Alarm.class);
        i.setAction("com.myApp.myCustomThing");
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
//        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 1, pi); // Millisec * Second * Minute
        am.set(AlarmManager.RTC_WAKEUP,1000*60,pi);
        Log.i("Info","Alarm Set");
    }

}

Я вижу следующую запись в logcat, сообщение журнала появляется независимо от того, находится ли приложение в памяти или нет.

 01-15 14:08:06.967 1396-1673/? V/AlarmManager: Triggering alarm #0: 2
 when =60399531 package =notification.me.com.myApp operation
 =*walarm*:com.myApp.myCustomThing flags =0x5

person Dwarakesh Pallagolla    schedule 15.01.2018    source источник
comment
Откуда вы звоните setAlarm()?   -  person azizbekian    schedule 15.01.2018
comment
Тревога a = новая тревога(); a.setAlarm(getApplicationContext()); Из моей основной деятельности   -  person Dwarakesh Pallagolla    schedule 15.01.2018
comment
Вы поставили будильник, который сработает через 60 секунд. Вы уверены, что ждете достаточно долго, чтобы увидеть, как это происходит?   -  person azizbekian    schedule 15.01.2018
comment
на каком устройстве вы тестируете?   -  person David Wasser    schedule 17.01.2018
comment
@ Дэвид Один плюс 5   -  person Dwarakesh Pallagolla    schedule 19.01.2018
comment
Я просмотрел форумы, и похоже, что это ошибка в OxygenOS и Android 8. Вы можете попробовать установить параметр «Не оптимизировать» для своего приложения в настройках батареи, чтобы посмотреть, поможет ли это.   -  person David Wasser    schedule 19.01.2018


Ответы (1)


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

Удалить android:enabled="false" из файла манифеста.

person azizbekian    schedule 15.01.2018
comment
Спасибо за ваш ответ, но удаление флага, похоже, не имеет никакого значения в этом случае. - person Dwarakesh Pallagolla; 15.01.2018