从接收器/服务打开屏幕

时间:2015-05-14 20:09:30

标签: android service android-wake-lock

我希望我的应用能够打开屏幕并显示我的应用。假设我正在设置闹钟,每小时我都希望我的应用在设备自然睡眠前显示2分钟。

我看到不推荐使用WakeLock(FULL_LOCK)和KeyguardManager。

我创建了一个WakefulBroadcastReceiver和服务,这些正在运行。

double f(const A& x)

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

由于

3 个答案:

答案 0 :(得分:24)

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

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文件中的以下权限:

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

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

答案 1 :(得分:2)

我不知道你在谈论什么,唤醒锁肯定不会被弃用。某些类型不再是谷歌首选的做事方式,但正常的唤醒锁仍然存在,仍然是最简单的方法。确保在进行锁定时添加ACQUIRE_CAUSES_WAKEUP标志。实际上注意到WakefulBroadcastReceiver是通过使用唤醒锁来实现的。

答案 2 :(得分:1)

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

private void turnScreenOn() {
    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    getWindow().addFlags(flags);
}

您可以使用此代码将其保持打开状态,直到唤醒锁定为止。

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

private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;

@Override
public void onCreate() {
super.onCreate();
    mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service");
}

private void acquireWakeLock() {
    try {
        mWakeLock.acquire();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

private void releaseWakeLock() {
    try {
        mWakeLock.release();
    }
    catch (Exception e) {

    }
}