Запустить экран активности, даже если экран заблокирован в Android

Как запустить активность на устройстве, даже если экран заблокирован. Я пробовал, как показано ниже, но это не работает.

Вещательный приемник:

Intent alarmIntent = new Intent("android.intent.action.MAIN");
        alarmIntent.setClass(context, Alarm.class);
        alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        alarmIntent.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +
                             WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD +
                             WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON +
                             WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        context.startActivity(alarmIntent);

person yuva ツ    schedule 21.11.2013    source источник


Ответы (6)


Вам необходимо следующее разрешение в файле AndroidManifest.xml:

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

Проверьте сведения о манифесте здесь. Вы можете проверить этот ссылка на ваш запрос.

person Pradip    schedule 21.11.2013

Вы можете добиться этого двумя способами:

  1. используя блокировку пробуждения, как объяснил @Yup в этом сообщении.

  2. с помощью оконных флагов.

Использование флагов окна:

Откройте действие А, которое вы хотите начать в onReceive(...). Вставьте это в onCreate() этого действия A

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

Убедитесь, что вы не вставляете его до setContentView(...) :-)

person Junaid    schedule 02.08.2015
comment
если я использую второй способ (используя флаги окна), мне не нужно запрашивать разрешение в androidmanifest.xml? - person Dika; 13.06.2017
comment
Да, у тебя нет разрешения @Dika - person Junaid; 06.11.2017
comment
у меня тоже сработало, когда экран заблокирован, он запускает мою активность, но другая работа в методе onCreate не вызывается. Например Я воспроизвожу звук, который не воспроизводится, если экран заблокирован. - person Chirag Jain; 30.01.2019
comment
воспроизведение звука, когда я прокомментировал mpPlay.stop(); из onPause - person Chirag Jain; 30.01.2019
comment
но проблема в том, что когда активность не отображается, звук должен останавливаться. Я застрял, пожалуйста, помогите. - person Chirag Jain; 30.01.2019
comment
Я также перешел по ссылке ниже, но безуспешно. активность начинается с экрана блокировки"> stackoverflow.com/questions/22643175/ - person Chirag Jain; 30.01.2019
comment
@ChiragJain, я уже давно не работаю на Android. Пожалуйста, опубликуйте свою проблему как еще один вопрос. Вы можете связать этот ответ с вашим опубликованным вопросом, хотя - person Junaid; 10.02.2019
comment
@Junaid Спасибо за ваш ответ, на самом деле каким-то образом мне это удалось, добавив метод mp.start в onResume вместо onCreate, потому что onResume снова вызывается последним if (mpPlay.isPlaying()) { mpPlay.stop(); mpPlay.reset(); } в методе onDestroy. при работе с этим сценарием блокировки экрана открывается активность. - person Chirag Jain; 11.02.2019

Вставьте это в свой метод onCreate действия, которое вы хотите открыть, когда экран заблокирован, после setContentView()

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
person Ahad Khan    schedule 29.04.2019
comment
Для меня это никогда не доходит до метода onCreate, что-то мешает ему до этого - person trampster; 08.04.2020

Вы можете проверить здесь, заблокирован ли экран или разблокирован.

Затем вы можете использовать блокировку пробуждения и параметры управления питанием, чтобы поддерживать экран без блокировки. вы можете найти помощь здесь

person Suneel Prakash    schedule 21.11.2013

Начиная с Android версии 10 (SDK версии 29), другие ответы больше не будут работать, если приложение работает в фоновом режиме, например, в файле BroadcastReceiver.

Чтобы заставить его работать на Android 10 и более поздних версиях, вы должны использовать полноэкранное намерение, если вам действительно нужно запустить действие из фона [источник]:

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

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

Этого можно добиться следующим образом [источник]:

val fullScreenIntent = Intent(this, CallActivity::class.java)
val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
    fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)

val notificationBuilder =
        NotificationCompat.Builder(this, CHANNEL_ID)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("Incoming call")
    .setContentText("(919) 555-1234")
    .setPriority(NotificationCompat.PRIORITY_HIGH)
    .setCategory(NotificationCompat.CATEGORY_CALL)

    // Use a full-screen intent only for the highest-priority alerts where you
    // have an associated activity that you would like to launch after the user
    // interacts with the notification. Also, if your app targets Android 10
    // or higher, you need to request the USE_FULL_SCREEN_INTENT permission in
    // order for the platform to invoke this notification.
    .setFullScreenIntent(fullScreenPendingIntent, true)

val incomingCallNotification = notificationBuilder.build()

Части этого ответа воспроизведены из работы, созданной и поделиться проектом Android с открытым исходным кодом и используется в соответствии с условиями, описанными в Creative Commons 2.5 Attribution License.

person notquiteamonad    schedule 04.05.2020

  1. файл манифеста дает разрешение на использование-разрешение android:name="android.permission.WAKE_LOCK" затем напишите код внутри в своей активности требования onCreate()
  2. Окончательное окно win= getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
person Jigar Rughani    schedule 22.02.2018