从接收器/服务打开屏幕

RuA*_*are 20 service android android-wake-lock

我希望我的应用能够打开屏幕并显示我的应用程序.假设我正在设置闹钟,每小时我都希望我的应用在设备自然睡眠前显示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);
}
Run Code Online (Sandbox Code Playgroud)

如何以编程方式打开屏幕,过去锁定并从IntentService显示我的活动?

谢谢

Kar*_*eek 26

您可以使用此代码打开屏幕.

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);
Run Code Online (Sandbox Code Playgroud)

您需要AndroidManifest.xml文件中的以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
Run Code Online (Sandbox Code Playgroud)

编辑(使用这一个,没有被弃用):
还有一个替代方法,因为你需要启动一个活动,在活动中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);`
}
Run Code Online (Sandbox Code Playgroud)