これは 2.0.1 から始まったと推測しています。おそらく機能として宣伝されたバッテリー寿命の向上の一部です。2.0 でウェイクアップまたはロック解除するための動作シェイクがありましたが、アップデートで壊れてしまい、回避策を得ることができませんでした。;'( CPU の部分的なロックが保持されているかどうかは問題ではありません。これは、CPU がスリープ状態になるのを常に防止するためのものです。USB 経由でデバッグのログを記録しているのを見たところ、スリープが発生したときにセンサー リスナーが変更されたことが時折言及されているようです。
ユーザーは、モトローラ デバイスで動作すると主張する回避策を投稿しました - https://sites.google.com/a/bug-br.org.br/android/technical-documents
回避策をテストし、チュートリアルから次のコードを作成し、いくつかのマニュアルを修正しました (彼のチュートリアルで提示されたコードにはいくつかの「バグ」があります)。
public class ShakeWakeupService extends Service implements SensorEventListener{
private Context mContext;
SensorManager mSensorEventManager;
Sensor mSensor;
// BroadcastReceiver for handling ACTION_SCREEN_OFF.
public BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Check action just to be on the safe side.
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Log.v("shake mediator screen off","trying re-registration");
// Unregisters the listener and registers it again.
mSensorEventManager.unregisterListener(ShakeWakeupService.this);
mSensorEventManager.registerListener(ShakeWakeupService.this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
};
@Override
public void onCreate() {
super.onCreate();
Log.v("shake service startup","registering for shake");
mContext = getApplicationContext();
// Obtain a reference to system-wide sensor event manager.
mSensorEventManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
// Get the default sensor for accel
mSensor = mSensorEventManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// Register for events.
mSensorEventManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
// Register our receiver for the ACTION_SCREEN_OFF action. This will make our receiver
// code be called whenever the phone enters standby mode.
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
}
@Override
public void onDestroy() {
// Unregister our receiver.
unregisterReceiver(mReceiver);
// Unregister from SensorManager.
mSensorEventManager.unregisterListener(this);
}
@Override
public IBinder onBind(Intent intent) {
// We don't need a IBinder interface.
return null;
}
public void onShake() {
//Poke a user activity to cause wake?
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//not used right now
}
//Used to decide if it is a shake
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return;
Log.v("sensor","sensor change is verifying");
}
}
この回避策は私には有効ですが、screebl を実行している間は機能しません。これは、多くのユーザーが私が開発しているものと連携させたいと本当に望んでいる機能です。