采用 <精通Android 3> 上的方法来解决 传感器监听器被关闭的问题
屏幕关闭通常会导致传感器监听器被关闭,所以另类的解决方法是设置屏幕为常亮状态.
缺点耗电,有些手机会出现不明问题.
核心代码片:
需要在oncreat的时候设置
mPwrMgr = (PowerManager) this.getSystemService(POWER_SERVICE);
mWakelock = mPwrMgr
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Accel");
mWakelock.acquire();
// Save the current value of the screen timeout, then set it always on
try {
mSavedTimeout = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT);
} catch (Exception e) {
mSavedTimeout = 120000; // 2 minutes
}
Settings.System.putInt(getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT, -1); // always on
捕获屏幕熄灭的广播
public BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
System.out.println("The screen has turned off");
// Turn the screen back on again, from the main thread
handler.post(new Runnable() {
public void run() {
if (mTurnBackOn != null)
mTurnBackOn.release();
mTurnBackOn = mPwrMgr.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP,
"AccelOn");
mTurnBackOn.acquire();
}
});
}
}
};
注册和注销广播
@Override
protected void onStart() {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
super.onStart();
}
@Override
protected void onStop() {
unregisterReceiver(mReceiver);
mWakelock.release();
if (mTurnBackOn != null)
mTurnBackOn.release();
super.onStop();
}
权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />