一. 传感器
传感器使用方式和定位服务类似:应用向特定的传感器注册监听器,获得更新通知。
private void registerWithAccelerometer(){ SensorManager sm=(SensorManager) getSystemService(Context.SENSOR_SERVICE); List<Sensor> sensors=sm.getSensorList(Sensor.TYPE_ACCELEROMETER); if(sensors!=null&&!sensors.isEmpty()){ SensorEventListener listener=new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub //dosomthing(); } }; Sensor sensor=sensors.get(0); sm.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_NORMAL); } }
和定位一样,android也可以让应用指定什么样的频度去获取传感器更新,位置服务是毫秒,只能指定4个值之一:SENSOR_DELAY_NORMAL,SENSOR_DELAY_UI,SENSOR_DELAY_GAME,SENSOR_DELAY_FASTEST.
当不需要通知时,禁用传感器的监听器。用SensorManager的unregisterListener()方法达到此目的。
二.WakeLock
在某些情况下,一些应用程序即使用户长时间不有设备交互,也要阻止设备进入休眠状态,来保持良好的用户体验。比如:当用户观看设备上的视频或电影时,这种情况下,需要CPU做视频解码,同时屏幕保持开启,让用户能够观看。此外,视频播放时屏幕不能变暗。
Android为这种场景设计了WakeLock类:
private void runInWakeLock(Runnable runnable, int flags) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(flags, "My WakeLock"); wl.acquire(); runnable.run(); wl.release(); }
注:应用需要WAKE_LOCK的权限来使用。
系统的行为取决于创建WakeLock对象传入的标记(flags)参数。定义如下:
(1)PARTIAL_WAKE_LOCK(CPU开)
(2) SCREEN_DIM_WAKE_LOCK(CPU开、暗色显示)
(3)SCREEN_BRIGHT_WAKE_LOCK(CPU开、明亮显示)
(4)FULL_WAKE_LOCK(CPU开、明亮显示、键盘开)
这些标记可以结合使用
(1)ACQUIRE_CAUSES_WAKEUP(打开屏幕和键盘)
(2)ON_AFTER_RELEASE(WakeLock释放后继续保持屏幕和键盘开启片刻)
防止问题出现:
使用带超时的WakeLock.acquire()版本,它会在超过时限后释放WakeLock。如:播放视频的应用可以使用视频长度作为WakeLock超时时间。
如果用到平屏幕是和Activity中的View关联的,也可以在布局文件中使用XML属性android:keepScreenOn.这样的好处是不必冒着忘记释放WakeLock的风险,交由系统处理。