如何将价值从活动传递到服务?

时间:2015-01-18 20:14:09

标签: android android-activity service

我对android很新,我试图将我的活动中的值传递给我的服务。 我已经看到了关于这个问题的其他答案,但我找不到我的问题,价值没有传递给服务。 在我的活动中,我有一个搜索栏,我希望当我更改搜索栏的值("进度")并激活服务时,服务会收到该值。当我关闭应用程序时,该值返回零,应该是另一个。 在我的活动中,我使用sharePreferences保存了值。

活动

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


    ...

     //SEEKBAR
    textViewSensibilidad.setText("Sensibilidad: " + progress*100/seekBar.getMax()+"%");
    seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onProgressChanged(SeekBar seekBar, int progresValue, boolean fromUser) {
            progress = progresValue;

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            textViewSensibilidad.setText("Sensibilidad: " + progress*100/seekBar.getMax()+"%");

                //SAVE STATE SEEKBAR
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putInt("progress", progress);
                editor.commit();

        }
     });


    //LOAD STATE SEEKBAR
    sharedPreferences = getSharedPreferences("progress" , Context.MODE_PRIVATE);
        progress = sharedPreferences.getInt("progress", progress);
        seekBar.setProgress(progress);
}


 public void onClick(View src) {
    if(toggleButton.isChecked()){
        Log.d(TAG, "onClick: starting srvice");
        Intent intent =  new Intent(ShakeActivity.this, MyService.class);
        intent.putExtra("progress", progress);
        startService(intent);

...

服务

public class MyService extends Service implements SensorEventListener {
    private static final String TAG = "Servicio";

@Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public int onStartCommand (Intent intent, int flags, int startId){
        super.onStartCommand(intent, flags, startId);

        Toast.makeText(this, "Shake to Open Whatsapp Activada", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "onStart");
if (intent !=null && intent.getExtras()!=null){
             progress = intent.getExtras().getInt("progress");
             checkeado=intent.getExtras().getBoolean("checkeado");
             Toast.makeText(this, "progreso: "+progress+" checkeado: "+checkeado, Toast.LENGTH_SHORT).show();
        }

        return START_STICKY;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d(TAG, "onCreate");


    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Shake to Open Whatsapp Desactivada", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "onDestroy");
        //player.stop();
        mSensorManager.unregisterListener(this);

    }

有什么建议吗?错误?我提前谢谢你

2 个答案:

答案 0 :(得分:0)

由于您已将进度值存储为共享首选项,因此您的服务只能获取共享首选项值。无需将其作为值传递给服务。

答案 1 :(得分:0)

在您的服务中注册共享首选项侦听器。文档:

http://developer.android.com/reference/android/content/SharedPreferences.html#registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener)

这将允许您使服务完全独立于活动,但在制作时会观察值的变化。

示例 - 使您的服务实现SharedPreferences.OnSharedPreferenceChangeListener接口。然后在您的服务中定义以下方法:

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
  if ("progress".equals(key) {
    int progress = sharedPreferences.getInt("progress", 0);
    // we have a new value -> react here
  }
}

最后不要忘记在onStartCommand方法中注册听众:

SharedPreferences sharedPrefs = getSharedPreferences("progress", Context.MODE_PRIVATE);
sharedPrefs.registerOnSharedPreferenceChangeListener(this);