アプリケーションがフォアグラウンドにない場合でも、常に加速度計をリッスンする必要があるアプリを構築しています。(この時点で、これは Play ストア用のアプリではないことを明確にしたいと思います。これは、バッテリーの消耗がそれほど問題にならない内部使用のための特定の目的を持つアプリです。ユーザーが歩いている場合は、どちらか教えてください)
これを実現するために、BroadcastReceiver
をリッスンしてandroid.intent.action.BOOT_COMPLETED
を登録するサービスを開始する を作成しましたSensorEventListener
。サービスは を取得しPARTIAL_WAKE_LOCK
、このロックでがコールバックSensorEventListener
を受信することを期待していましonChange()
たが、それは起こっていません。ただし、FULL_WAKE_LOCK
それは機能しますが、画面をオンにしたくないので、ユーザーはスタンバイボタンを押すこともあります...デバッグセッションでは、サービスが破棄されているのを見たことがありません。リリースされました。
Service
ロックを取得してセンサーを登録するクラスは次のとおりです。
public class WalkingDetectorService extends Service {
private static PowerManager.WakeLock wakeLock = null;
private static final String LOCK_TAG = "WALKING_DETECTOR";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
acquireLock(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// started on boot from a BroadcastReceiver
startMotionDetector(getApplication());
return START_STICKY;
}
@Override
public void onDestroy() {
releaseLock();
super.onDestroy();
}
private void startMotionDetector(Application application) {
int sensitivityIdx = SettingsManager.getInt(application, SettingsManager.SETTING_SENSOR_SENSITIVITY);
if (sensitivityIdx == -1) {
sensitivityIdx = MotionSensor.DEFAULT_SENSITITY_IDX;
}
float fSens = MotionSensor.getSensivity(sensitivityIdx);
//SensorEventListener is registered here. It is properly done. Only stops listen when screen goes off (by timeout or user pressing the standby button)
MotionSensor.startMotionSensor(application, fSens);
}
public static synchronized void acquireLock(Context ctx) {
if (wakeLock == null) {
PowerManager mgr = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
wakeLock = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, LOCK_TAG);
wakeLock.setReferenceCounted(true);
}
wakeLock.acquire();
}
public static synchronized void releaseLock() {
if (wakeLock != null) {
if (wakeLock.isHeld())
{
wakeLock.release();
}
}
}
}
あなたから助けを得るために必要なすべての情報を提供したと思います。役に立つコードがあると思われる場合は、喜んで協力させていただきます。ありがとうございました