唤醒Android设备

嘿,我需要在特定的时间唤醒我的睡眠机器人。 有什么build议么?

PS唤醒:打开显示,也许解锁手机

最好的是使用这些窗口标志的一些适当的组合:

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_DISMISS_KEYGUARD
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_TURN_SCREEN_ON

如果您希望在不支持所需标志的旧版平台上运行,则可以直接使用唤醒锁和键盘锁…但这条路线充满了危险。

一个重要提示 :为了使上述标志组合起作用,您的活动必须全屏 。 在我的应用程序,我试图使用这些标志与不是全屏(对话框主题)的活动,它没有工作。 在查看文档后,我发现这些标志要求窗口是全屏窗口。

唤醒屏幕:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG"); wakeLock.acquire(); 

释放屏幕locking:

 KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG"); keyguardLock.disableKeyguard(); 

清单需要包含:

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

有关PowerManager的更多详细信息,请参阅API文档: http : //developer.android.com/reference/android/os/PowerManager.html

编辑:这个答案被报告为已弃用。

我find了一种方法,它不是那么复杂…适用于任何API版本。

您需要使用PowerManager.userActivity(l, false)方法,并将您的活动注册为SCREEN_OFF意图收到的广播:

在你的积极性OnCreate把像这样的东西:

 mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "Screen OFF onReceive()"); screenOFFHandler.sendEmptyMessageDelayed(0, 2000L); } }; 

在屏幕closures事件2秒后,它将启动处理程序。

在你的onResume()方法中注册接收者:

 IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(mReceiver, filter); Log.i(TAG, "broadcast receiver registered!"); 

创build一个如下所示的处理程序:

 private Handler screenOFFHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // do something // wake up phone Log.i(TAG, "ake up the phone and disable keyguard"); PowerManager powerManager = (PowerManager) YourActivityName.this .getSystemService(Context.POWER_SERVICE); long l = SystemClock.uptimeMillis(); powerManager.userActivity(l, false);//false will bring the screen back as bright as it was, true - will dim it } }; 

清单文件中的请求权限:

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

完成后,请勿忘记注销广播接收器。 你可以在onDestroy()中做到这一点(这是不能保证)

 unregisterReceiver(mReceiver); Log.i(TAG, "broadcast UNregistred!"); 

以编程方式设置闹钟会唤醒手机(播放声音),我猜想显示屏会是一个选项。

我不觉得会有一个暴露的API,将自动解锁手机。

 getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD); 

将解除一般键盘锁并导致设备解锁。

如果您在醒来时显示一个窗口,则可以通过向活动添加less许标志而轻松地工作,而不使用唤醒锁。

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } 
Interesting Posts