我想在Android上用TYPE_STEP_COUNTER制作一个计步器。如你所知, 重新启动设备时TYPE_STEP_COUNTER将重置。所以我应该保留这些步骤。我决定使用SharedPreference来保存它。 项目结构如下:
在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中保存数据?
答案 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();
}
}