活动和服务之间的SharedPreference

时间:2017-06-15 14:03:20

标签: java android

我想在Android上用TYPE_STEP_COUNTER制作一个计步器。如你所知, 重新启动设备时TYPE_STEP_COUNTER将重置。所以我应该保留这些步骤。我决定使用SharedPreference来保存它。 项目结构如下: enter image description here

在MainActivity.java中,



    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text_step = (TextView) findViewById(R.id.main_text_step);
        delayHandler = new Handler(this);
        Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        SharedPreferences.Editor editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
    }




但是,当我将数据放入StepService.java时,它失败了。 //StepService.java

  

editor.putInt("步骤",StepDetector.CURRENT_STEP);   editor.putString("日期",CURRENT_DATE);

它说无法解析符号编辑器。 你能给我一些建议,我应该怎样做才能在StepService.java中保存数据?

当我在service.java中声明时,它显示如下: enter image description here

3 个答案:

答案 0 :(得分:2)

您需要在editor之外声明onCreate以使其对其他方法可见,因为当前声明将其范围限制为仅在onCreate方法内,简而言之它是​​{{1引用变量

Local

要在其他类中使用 SharedPreferences.Editor editor; // ^^^^^^^^^^ declare it outside protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_step = (TextView) findViewById(R.id.main_text_step); delayHandler = new Handler(this); Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit(); // initialize editor } ,请按照上面所示声明并初始化它,同时使用相同的文件名editor将数据保存到该文件中。

DateStep中的服务类,override onCreate并应用相同的方法

service

答案 1 :(得分:2)

您需要提交更改。

editor.putInt("step",StepDetector.CURRENT_STEP);
editor.putString("date",current_Date);
editor.apply(); // <-- Save the data in the Shared Preferences.

然后在您的服务中,您可以再次获取共享首选项并获取值。 您不需要在两个类之间共享编辑器。在StepService中再次请求共享首选项:

Context mContext = context;
// ...

mContext.getSharedPreferences("DateStep",MODE_PRIVATE).edit();
// Then get the data you want.

修改

// In StepService

Editor mEditor;

@Override
public void onCreate() {
    super.onCreate(); 
    mEditor = getApplicationContext().getSharedPreferences("DateStep",MODE_PRIVATE).edit();
    // Then get the data you want anywhere in your Service
}

答案 2 :(得分:2)

我会使用一个界面来交流活动和服务:它使代码更清晰,更易于阅读和测试。如果您从未使用它们,可能会有点混乱,但需要花一点时间来理解代码:

ServiceCallback.java

public interface ServiceCallback {
    void updateStepValue(int value, String date);
}

StepService.java

public class StepService extends Service {
   ServiceCallback mCallback;

   public void bindCallback(ServiceCallback callback) {
       mCallback = callback;
   }

   public void unbindCallback() { 
       mCallback = null; 
   }

   // Somewhere in your code, call callback method to send data to Activity
   ...
   mCallback.updateStepValue(5, "15-07-2017");
}

Activity.java

public class Activity implements ServiceCallback {
    SharedPreferences.Editor editor;
    StepService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        editor = context.getSharedPreferences("preferences_key", Context.MODE_PRIVATE).edit();
        // Once your service is running and assigned to service variable
        // bind activity to it to listen service callbacks
        service.bindCallback(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        service.unbindCallback();
    }

    @Override
    void updateStepValue(int value, String date) {
         editor.putInt("step",value);
         editor.putString("date",date);
         editor.apply();
    }
}