2014-05-22 8 views
0

나는 움직임을 감지하기 위해 SensorEventListener을 구현하는 Android Service이 있습니다. 나는 CheckBoxPreference을 가지고 있는데, 사용자가 모션 디텍션을 켜거나 끌 수 있습니다. 내가 직면하고있는 문제는 서비스에서 올바른 값을 얻을 수 없다는 것인데, 즉 OnSensorChanged 메서드에서 발생합니다.Android : 서비스에서 ChekboxPreference 값 읽기

서비스가 시작되는 즉시 서비스가 시작됩니다. 서비스를 시작하는 활동이 있고 그 활동에 묶여 있습니다.

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; 
      } 
     }); 
    } 

및 unchek을의 SettingsActivity 쇼에서 로그 그 MotionService.SHAKE_ENABLE의 값 및 MotionService.SHAKE_THRESHOLD이 변경되었지만 MotionServiceOnSensorChanged 방법에 반영되지 않았습니다.

어디로 잘못 가고 있습니까? 도움이 감사합니다!

답변

0

왜 체크 박스를 선택해야하나요? 이것이 귀하의 환경 설정 체크 박스라면 각 변경 사항은 앱의 환경 설정에 반영됩니다. 그래서 기본적으로 당신의 선호도의 현재 상태를 읽습니다.

+0

나는 getDefaultSharedPreferences()를 사용하여 OnSensorChanged 메소드에서이를 시도했다. 체크 박스를 선택/해제 한 후에도 값은 변경되지 않습니다. – PsyGik