android - programar - Encendido de la pantalla desde el receptor/servicio
doble toque para encender pantalla apk (3)
No sé de qué estás hablando, wakelock definitivamente no está en desuso. Ciertos tipos ya no son la forma preferida de Google de hacer las cosas, pero los wakelocks normales siguen existiendo y siguen siendo la forma más fácil de hacerlo. Asegúrese de agregar el indicador ACQUIRE_CAUSES_WAKEUP al tomar el bloqueo. De hecho, observe que se implementa un WakefulBroadcastReceiver utilizando wakelocks.
Me gustaría que mi aplicación pueda encender la pantalla y mostrar mi aplicación. Digamos que estoy configurando una alarma y cada hora quiero que mi aplicación se muestre durante 2 minutos antes de que el dispositivo duerma naturalmente.
Veo que WakeLock (FULL_LOCK) y KeyguardManager están en desuso.
He creado un WakefulBroadcastReceiver y un servicio y estos están funcionando.
@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);
}
¿Cómo enciendo programáticamente la pantalla, paso el bloqueo y visualizo mi Actividad desde IntentService?
Gracias
Puede usar este código para encender la pantalla.
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);
Necesita el siguiente permiso en el archivo AndroidManifest.xml:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
EDITAR (USAR ESTE, NADA SE DESPRECTA):
Hay una alternativa más para hacer esto, para eso necesitas iniciar una actividad. En la actividad
onCreate()
necesitas agregar las banderas a la ventana.
Por ejemplo:
@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);`
}
Puede usar este código para encender la pantalla.
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);
}
Puede usar este código para mantenerlo activado hasta que el bloqueo de activación esté atenuado.
<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) {
}
}