Включение экрана с приемника/службы
Я хочу, чтобы мое приложение могло включить экран и отобразить мое приложение. Позвольте сказать, что я устанавливаю будильник, и каждый час я хочу, чтобы мое приложение отображалось в течение 2 минут до того, как устройство естественно спит.
Я вижу, что WakeLock (FULL_LOCK) и KeyguardManager устарели.
Я создал WakefulBroadcastReceiver и службу, и они работают.
@Override
protected void onHandleIntent(Intent intent) {
// I need to show the screen here!
for (int i=0; i<5; i++) {
Log.i("SimpleWakefulReceiver", "Running service " + (i + 1)
+ "/5 @ " + SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
Log.i("SimpleWakefulReceiver", "Completed service @ " +
SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
Как программно включить экран, пройти блокировку и отобразить мою активность из IntentService?
Спасибо
Ответы
Ответ 1
Вы можете использовать этот код, чтобы включить экран.
lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
lock.disableKeyguard();
wake.acquire();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
Вам нужно следующее разрешение в файле AndroidManifest.xml:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
ИЗМЕНИТЬ (ИСПОЛЬЗУЙТЕ ЭТО ОДИН, НИЧЕГО НЕ УДАЛЕН):
Для этого есть еще одна альтернатива, для чего вам нужно запустить действие. В действии onCreate()
вам нужно добавить флаги в окно.
Например:
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);`
}
Ответ 2
Я не знаю, о чем вы говорите, wakelock определенно не устарел. Определенные типы больше не являются предпочтительным способом Google, но обычные wakelocks все еще вокруг и все еще самый простой способ сделать это. Обязательно добавьте флаг ACQUIRE_CAUSES_WAKEUP при блокировке. На самом деле заметьте, что WakefulBroadcastReceiver реализован с использованием wakelocks.
Ответ 3
Вы можете использовать этот код, чтобы включить экран.
private void turnScreenOn() {
int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
getWindow().addFlags(flags);
}
Вы можете использовать этот код, чтобы поддерживать его до тех пор, пока блокировка слежения не будет уменьшена.
<uses-permission android:name="android.permission.WAKE_LOCK" />
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
@Override
public void onCreate() {
super.onCreate();
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service");
}
private void acquireWakeLock() {
try {
mWakeLock.acquire();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void releaseWakeLock() {
try {
mWakeLock.release();
}
catch (Exception e) {
}
}