Android: 从服务唤醒屏幕
Android: Wake up screen from a service
我正在开发一个 android 应用程序,它可以聆听周围的声音并执行命令。
命令之一是唤醒屏幕。
为了实现该目标,我正在使用以下功能,在我的服务中:
private void wakeupScreen() {
new AsyncTask<Void, Void, Exception>() {
@Override
protected Exception doInBackground(Void... params) {
try {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
try {
Thread.sleep(10000); // turn on duration
} catch (InterruptedException e) {
e.printStackTrace();
}
fullWakeLock.release();
} catch (Exception e) {
return e;
}
return null;
}
}.execute();
}
但是,这段代码有几个问题:(它在 服务 上运行)
使用SCREEN_BRIGHT_WAKE_LOCK
和FULL_WAKE_LOCK
是deprecated。
使用 AsyncTask 和睡眠似乎是一种以非阻塞方式打开屏幕的糟糕解决方案。
我想知道是否存在更优雅的方法。有什么建议吗?
启动 activity,只是为了在 onCreate()
下打开屏幕。
查看
上的讨论
显然,没有优雅的方法可以实现该目标。
我将总结我对该问题的 3 个非优雅的解决方案,以供将来的读者使用:
以异步方式使用唤醒锁:
private void wakeupScreen() {
new AsyncTask<Void, Void, Exception>() {
@Override
protected Exception doInBackground(Void... params) {
try {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
try {
Thread.sleep(10000); // turn on duration
} catch (InterruptedException e) {
e.printStackTrace();
}
fullWakeLock.release();
} catch (Exception e) {
return e;
}
return null;
}
}.execute();
}
Simulate HOME button click.(类似于解决方案 2,无需创建自定义 activity,行为略有不同)
我发现第一个解决方案最符合我的需要。
我正在开发一个 android 应用程序,它可以聆听周围的声音并执行命令。
命令之一是唤醒屏幕。
为了实现该目标,我正在使用以下功能,在我的服务中:
private void wakeupScreen() {
new AsyncTask<Void, Void, Exception>() {
@Override
protected Exception doInBackground(Void... params) {
try {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
try {
Thread.sleep(10000); // turn on duration
} catch (InterruptedException e) {
e.printStackTrace();
}
fullWakeLock.release();
} catch (Exception e) {
return e;
}
return null;
}
}.execute();
}
但是,这段代码有几个问题:(它在 服务 上运行)
使用
SCREEN_BRIGHT_WAKE_LOCK
和FULL_WAKE_LOCK
是deprecated。使用 AsyncTask 和睡眠似乎是一种以非阻塞方式打开屏幕的糟糕解决方案。
我想知道是否存在更优雅的方法。有什么建议吗?
启动 activity,只是为了在 onCreate()
下打开屏幕。
查看
显然,没有优雅的方法可以实现该目标。
我将总结我对该问题的 3 个非优雅的解决方案,以供将来的读者使用:
以异步方式使用唤醒锁:
private void wakeupScreen() { new AsyncTask<Void, Void, Exception>() { @Override protected Exception doInBackground(Void... params) { try { PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK"); fullWakeLock.acquire(); // turn on try { Thread.sleep(10000); // turn on duration } catch (InterruptedException e) { e.printStackTrace(); } fullWakeLock.release(); } catch (Exception e) { return e; } return null; } }.execute(); }
Simulate HOME button click.(类似于解决方案 2,无需创建自定义 activity,行为略有不同)
我发现第一个解决方案最符合我的需要。