从接收器/服务打开屏幕接收器、屏幕

2023-09-12 10:30:32 作者:奶泡♂

我想我的应用程序能够把在屏幕上显示我的应用程序。比方说,我设置一个报警,并每隔一小时我要显示我的应用程序2分钟前的设备自然睡。

I would like my app to be able to turn the screen on and display my app. Let's say I'm setting an alarm and every hour I want my app to be displayed for 2 mins before the device naturally sleeps.

我看到WakeLock(FULL_LOCK)和KeyguardManager是德precated。

I see that WakeLock (FULL_LOCK) and KeyguardManager are deprecated.

我创建了一个WakefulBroadcastReceiver和服务,这些都在工作。

I have created a WakefulBroadcastReceiver and service and these are working.

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

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

How do I programmatically turn on the screen, get past lock and display my Activity from the IntentService ?

感谢

推荐答案

您可以使用此code打开屏幕上。

You can use this code to turn the screen on.

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

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

You need the following permission in AndroidManifest.xml file:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

修改(使用这一个,没有什么是DE preCATED): 没有这样做,因为你需要启动一个活动,在活动的多了一个另外的的onCreate()您需要将标志添加到窗口。 例如:

EDIT (USE THIS ONE, NOTHING IS DEPRECATED): There is an one more alternative for doing this, for that you need to launch an activity, In the activity onCreate() you need to add the flags to the window. For example:

   @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);`
}