簡體   English   中英

屏幕關閉時,服務中的android加速計停止運行

[英]android accelerometer in service stops when screen is turned off

我將加速計代碼投入使用。 但是當屏幕關閉時它停止。 通過usb插入電話時,它不會停止,但沒有插入時,它會停止。 所有帖子都說使用中的加速度計不會停止。 但是即使在使用中,我的代碼中的加速度計也會停止。 這是我的代碼。 我必須在代碼中添加什么? (我的測試電話是三星Galaxy S3 3G。)

// Service
public class LocalService extends Service {
    private final IBinder mBinder = new LocalBinder();
    private final Random mGenerator = new Random();

    private SensorManager senSensorManager;
    private Sensor senAccelerometer;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("t", "onCreate");

        senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        senSensorManager.registerListener(mSensorEventListener, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        senSensorManager.unregisterListener(mSensorEventListener);
        // this sound is for checking
        try {
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
            r.play();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private SensorEventListener mSensorEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            Sensor mySensor = event.sensor;

            if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                // this vibrator is for checking
                Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                vibe.vibrate(100);
                //Log.i("t", "onSensorChanged");
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {}
    };
    public class LocalBinder extends Binder {
        LocalService getService() {
            return LocalService.this;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    public int getRandomNumber() {
        return mGenerator.nextInt(100);
    }
}
// Activity
public class MainActivity extends ActionBarActivity {
    LocalService mService;
    boolean mBound = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) this.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mBound) {
                    int num = mService.getRandomNumber();
                    Toast.makeText(getBaseContext(), "number: " + num, Toast.LENGTH_SHORT).show();
                }
            }
        });
        Intent intent = new Intent(this, LocalService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }
    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                                       IBinder service) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

// 添加
我決定使用PARTIAL_WAKE_LOCK。 對我來說這是最好的解決方案。 讀這個。 http://nosemaj.org/android-persistent-sensors http://nosemaj.org/android-persistent-sensors

在您的代碼中,您使用的是LocalService ,它綁定Activity (您正在調用bindServiceunbindService )。 這樣做會使您的服務停止,然后活動停止 ,因為您的服務充當綁定的服務,並在最后一次綁定關閉時停止。 請參閱綁定服務生命周期以獲取參考

如果您真的希望您的服務始終不綁定它-您應該只是在某個地方啟動(使用startService方法),然后僅停止它,那么您實際上就不再需要加速計跟蹤。

編輯

如果問題不是服務正在停止,而是加速度計停止,則應保持喚醒鎖 ,否則設備將關閉並且傳感器將不會向您報告任何數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM