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();
}

但是,这段代码有几个问题:(它在 服务 上运行)

我想知道是否存在更优雅的方法。有什么建议吗?

启动 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,行为略有不同)

我发现第一个解决方案最符合我的需要。