0

我有一个Service用于SensorEventListener检测运动的 Android。我有一个CheckBoxPreference用户可以选择启用或禁用运动检测的地方。我面临的问题是我无法在服务中获得正确的值,即在OnSensorChanged方法中。

该服务在应用程序启动后立即启动。有一个启动服务的活动,并与它绑定。

我检测到运动变化的服务:

    public class MotionService extends Service implements SensorEventListener{

     public static int SHAKE_THRESHOLD = 0;
    public static boolean SHAKE_ENABLE = false;
 @Override
    public void onCreate() {
        if (D) Log.d(TAG, "Creating service");
        super.onCreate();
 SHAKE_THRESHOLD = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("shake_threshold",60)*10;
        SHAKE_ENABLE = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("shake_enable",false);
}

    @Override
        public void onSensorChanged(SensorEvent event) {
            Sensor mySensor = event.sensor;

            if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];
                long curTime = System.currentTimeMillis();
                if ((curTime - lastUpdate) > 100) {
                    long diffTime = (curTime - lastUpdate);
                    lastUpdate = curTime;

                    float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000;

                    Log.d("Sensor Changed",SHAKE_THRESHOLD+"================="+SHAKE_ENABLE); //values here remain the same ones i assign on OnCreate, even though i change it in the settings. It should change when i change from settings. NOT HAPPENING!!

                        if (speed > SHAKE_THRESHOLD) {
                            //do sensor related stuffs here
                            if (SHAKE_ENABLE) { //the boolean value i get from the preferences

                                if ((x) > 8.0000) {
                                    Log.d("sensor", "=====LEFT====");

                                } else if ((x) < -8.0000) {
                                    Log.d("sensor", "=====RIGHT====");


                                } else if ((z) < -0.0) {
                                    Log.d("sensor", "=====UP====");

                                } else if ((y) < 1.0) {
                                    Log.d("sensor", "=====DOWN====");

                                }
                            }
                            last_x = x;
                            last_y = y;
                            last_z = z;
                        }
                }

            }

        }
    }

这是我的偏好活动:

public class SettingsActivity extends PreferenceActivity {
@Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Fade it in
        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
        addPreferencesFromResource(R.xml.settings);
final CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager().findPreference("shake_enable");

        checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Log.d("MyApp", "Pref " + preference.getKey() + " changed to " + newValue.toString());
                if (newValue.toString().equals("true")){
                    MotionService.SHAKE_ENABLE=true;
                    Log.d("SHAKE_ENABLE",MotionService.SHAKE_ENABLE+"================="+MotionService.SHAKE_THRESHOLD);
                    MotionService.SHAKE_THRESHOLD = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("shake_threshold",60);
                }
                else{
                    MotionService.SHAKE_ENABLE=false;
                    Log.d("SHAKE_ENABLE",MotionService.SHAKE_ENABLE+"================="+MotionService.SHAKE_THRESHOLD);
                    MotionService.SHAKE_THRESHOLD = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("shake_threshold",60);
                }
                    return true;
            }
        });
    }

因此,当我检查和取消检查时,显示的日志SettingsActivity显示MotionService.SHAKE_ENABLE和的值MotionService.SHAKE_THRESHOLD已更改,但未反映OnSensorChangedMotionService.

我哪里错了?帮助赞赏!

4

1 回答 1

0

你为什么还要打扰复选框?如果这是您的首选项复选框,那么每个更改都会反映在您应用的首选项中。所以基本上只需阅读您偏好的当前状态

于 2014-05-22T08:24:46.887 回答