Android:通过服务唤醒屏幕

时间:2015-09-15 16:42:01

标签: android screen

我正在研究一款能够聆听周围声音的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_LOCKFULL_WAKE_LOCKdeprecated

  • AsyncTask和sleep的使用对于以非阻塞方式打开屏幕似乎是一个糟糕的解决方案。

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

3 个答案:

答案 0 :(得分:1)

启动活动,只是为了在onCreate()下启用屏幕。

请参阅what is the proper, non-deprecated way to wake up the device?

上的讨论

答案 1 :(得分:0)

我正在做以下

WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 1;
getWindow().setAttributes(params);

或试试这个

Window window = this.getWindow();
window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);

答案 2 :(得分:0)

显然,没有优雅的方法来实现这一目标。

对于未来的读者,我将总结我对该问题的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();
    }
    
  • Launch an activity that turns the screen on.

  • Simulate HOME button click.(类似于解决方案2,无需创建自定义活动,行为略有不同)

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