Запустить активность, когда устройство заблокировано android 8+ - PullRequest
0 голосов
/ 11 марта 2020

У меня очень простое приложение в android, на первой странице есть кнопка, и когда вы нажимаете на нее через несколько секунд, она открывает другое действие, но я хочу показать второе действие, когда устройство заблокировано android 8,9 и 10 какое лучшее решение?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

вот мое решение, но оно не работает на android 10 устройствах

if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {

       KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);


       assert kgm != null;
       kgm.requestDismissKeyguard(ScreenLock.this, null);
       setShowWhenLocked(true);
       setTurnScreenOn(true);


   }

   else
   {
       final Window win = getWindow();
       win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
       win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
               | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
               | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

   }
0 голосов
/ 11 марта 2020

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

Из документов :

Broadcast Action: Отправляется, когда устройство переходит в спящий режим и перестает работать в интерактивном режиме.

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

Эта широковещательная передача отправляется, когда устройство перестает работать в интерактивном режиме. что может не иметь ничего общего с выключением экрана. Чтобы определить фактическое состояние экрана, используйте Display.getState ().

Сначала вам нужно будет создать класс приемника:

public class SomeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            .
            .
            .

А затем зарегистрировать его:

class MainActivity : AppCompatActivity() {

    private val someReceiver = SomeReceiver()

    override fun onStart() {
        super.onStart()

        val intentFilter = IntentFilter();
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(someReceiver, intentFilter)
    }

    override fun onDestroy() {
        unregisterReceiver(someReceiver)

        super.onDestroy()
    }

}

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

Редактирование

Из-за изменений в Android 7 и 8, изменения, связанные с предельными значениями фонового выполнения приложения, предназначенные для уровня API 26 или выше, больше не могут регистрировать широковещательные приемники для неявных широковещательных рассылок в своем манифесте. Есть некоторые исключения, которые вы можете найти здесь

...