最近一个项目中需要实现屏幕熄屏后保持外接设备正常工作,经过一些列的调查,发现有下面2中方法可以实现,不敢独享,现公布于众。
方法一:在app中实现
代码如下:
import android.os.PowerManager; import android.os.PowerManager.WakeLock; private WakeLock wakeLock = null; private void acquireWakeLock() { if (wakeLock == null) { Log.d(TAG, "acquireWakeLock"); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass() .getCanonicalName()); wakeLock.acquire(); } } private void releaseWakeLock() { if (wakeLock != null && wakeLock.isHeld()) { Log.d(TAG, "releaseWakeLock"); wakeLock.release(); wakeLock = null; } }
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DEVICE_POWER" />
最后,别忘了加系统签名。
方法二:驱动中实现
驱动程序的API
驱动程序可以通过添加wakelock变量的状态,并调用wake_lock_init如下面的片段所示,使用wakelock的API:
struct state {
struct wakelock wakelock;
}
init() {
wake_lock_init(&state->wakelock, WAKE_LOCK_SUSPEND, "wakelockname");
}
Before freeing the memory, wake_lock_destroy must be called:
uninit() {
wake_lock_destroy(&state->wakelock);
}
当驱动程序确定它需要运行(通常在一个中断处理程序),它调用wake_lock:
wake_lock(&state->wakelock);
当它不再需要运行,它调用wake_unlock:
wake_unlock(&state->wakelock);
它也可以调用wake_lock_timeout拖延后释放wakelock:
wake_lock_timeout(&state->wakelock, HZ);