1

アプリケーションがフォアグラウンドにない場合でも、常に加速度計をリッスンする必要があるアプリを構築しています。(この時点で、これは 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();
            }
        }
    }
}

あなたから助けを得るために必要なすべての情報を提供したと思います。役に立つコードがあると思われる場合は、喜んで協力させていただきます。ありがとうございました

4

0 に答える 0