Как надежно получить событие разблокировки экрана для уровня API> = 26? - PullRequest
0 голосов
/ 04 января 2019

Согласно официальной документации, BroadcastReceiver для событий блокировки / разблокировки экрана может быть зарегистрирован только динамически (путем вызова registerReceiver изнутри Activity), начиная с Android O (API 26).Регистрация этих событий в AndroidManifest.xml больше не работает, поэтому приложение больше не может получать эти события (ACTION_SCREEN_ON / ACTION_USER_PRESENT), когда приложение не запущено (ранее было убито Android или принудительно закрыто пользователем).

То же самое упоминается в посте: Android - обнаружение события разблокировки телефона, а не экрана на

Есть ли другой альтернативный надежный и возможный способ получения события блокировки / разблокировки экрана?

Пробная неявная трансляция для получения события блокировки / разблокировки экрана путем регистрации ACTION_USER_PRESENT в .xml файле приложения AndroidManifest.Но, согласно документу, прямая трансляция, за исключением некоторых исключений, не будет работатьВы должны сделать это с помощью динамической регистрации registerReceiver в классе деятельности.Таким образом, если приложение уничтожено ОС Android или может быть принудительно остановлено пользователем, широковещательная блокировка / разблокировка экрана приложением не получена.

Приемник динамической широковещательной передачи класса активности

 registerReceiver(new PhoneUnlockedReceiver(), 
                  new  IntentFilter("android.intent.action.USER_PRESENT"));

public class PhoneUnlockedReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(
                    Context.KEYGUARD_SERVICE);
            if (keyguardManager.isKeyguardSecure()) {

                //phone was unlocked, add handling here          

            }
        }
}
...