Java 共享活动和服务之间的引用
我想在Android上做一个步进计数器,类型为_step _counter, 键入\u步骤\u计数器将在重新引导设备时重置。因此我应该保留这些步骤。我决定使用SharedReference来保留它。 项目结构如下: 在MainActivity.java中Java 共享活动和服务之间的引用,java,android,Java,Android,我想在Android上做一个步进计数器,类型为_step _counter, 键入\u步骤\u计数器将在重新引导设备时重置。因此我应该保留这些步骤。我决定使用SharedReference来保留它。 项目结构如下: 在MainActivity.java中 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text\u step=(TextView)findViewById(R.id.main\u text\u step);
delayHandler=新处理程序(此);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
SharedReferences.Editor Editor=getSharedReferences(“DateStep”,MODE_PRIVATE).edit();
}
您需要在onCreate
外部声明编辑器,以使其对其他方法可见,因为当前声明将其范围限制为仅在onCreate
方法内部,简而言之,它是一个本地
引用变量
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
}
要在其他类中使用编辑器
,请按上图所示声明并初始化它,同时使用相同的文件名DateStep
将数据保存在该文件中
在服务类中,覆盖服务中的
,并应用相同的方法
SharedPreferences.Editor editor;
// ^^^^^^^^^^ declare it outside
@Override
public void onCreate() {
super.onCreate();
editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
// initialize editor
}
您需要在onCreate
外部声明编辑器,以使其对其他方法可见,因为当前声明将其范围限制为仅在onCreate
方法内部,简而言之,它是一个局部
引用变量
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
}
要在其他类中使用编辑器
,请按上图所示声明并初始化它,同时使用相同的文件名DateStep
将数据保存在该文件中
在服务类中,覆盖服务中的
,并应用相同的方法
SharedPreferences.Editor editor;
// ^^^^^^^^^^ declare it outside
@Override
public void onCreate() {
super.onCreate();
editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
// initialize editor
}
您需要提交更改
editor.putInt("step",StepDetector.CURRENT_STEP);
editor.putString("date",current_Date);
editor.apply(); // <-- Save the data in the Shared Preferences.
编辑
您需要提交更改
editor.putInt("step",StepDetector.CURRENT_STEP);
editor.putString("date",current_Date);
editor.apply(); // <-- Save the data in the Shared Preferences.
编辑
我会使用一个接口来交流活动和服务:它使代码更干净,更易于阅读和测试。如果您从未使用过它们,可能会有点困惑,但请花一分钟时间理解代码:
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();
}
}
我会使用一个接口来交流活动和服务:它使代码更干净,更易于阅读和测试。如果您从未使用过它们,可能会有点困惑,但请花一分钟时间理解代码:
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();
}
}
您可能应该显示更多的实际问题代码,以便我们有更多的上下文。另外,不要对java代码使用代码段。只需使用代码块您可能应该显示更多实际问题代码,这样我们就有了更多的上下文。另外,不要对java代码使用代码段。只要使用代码块当我按照你告诉我的那样更改时,同样的错误也会发生。Service.java仍然无法识别编辑器。这不是在其他方法中使用它的问题。问题似乎在于它没有在不同的类中声明您必须在不同的类中声明您的编辑器
,如上图所示,或者您可以创建一个实用程序类,它使用上下文将传递的数据保存到首选项,它不需要(也不应该)在onCreate()之外声明
如果这是该类中使用编辑器的唯一位置。编辑器是否可以在service.java中声明而不是在活动中?当我按照您的指示进行更改时,同样的错误也会发生。service.java仍然无法识别编辑器。这不是在其他方法中使用它的问题。问题似乎在于它没有在不同的类中声明您必须在不同的类中声明您的编辑器
,如上图所示,或者您可以创建一个实用程序类,它使用上下文将传递的数据保存到首选项,它不需要(也不应该)在onCreate()之外声明
如果这是该类中使用的唯一位置。编辑器可以在service.java中声明而不是在activity中声明吗?问题是service.java无法读取mainActivity.java中定义的变量编辑器。正是因为它是在活动中定义的。只需获取编辑器的另一个实例。我已经更新了我的答案上面所有我将使用的编辑器都在服务中,包括put和get。所以我只能在服务中声明它吗?如果您只在服务中使用它,那么,是的,只需声明、初始化并在其中使用它,您就可以在服务中获取应用程序上下文(getApplicationContext()
)。然后,因为共享首选项可以从应用程序中的任何位置访问,所以您可以检索数据,问题是service.java无法读取mainActivity.java中定义的变量编辑器。正是因为它是在活动中定义的。只需获取编辑器的另一个实例。我已经更新了我的答案上面所有我将使用的编辑器都在服务中,包括put和get。所以我只能在服务中声明它吗?如果您只在服务中使用它,那么,是的,只需声明、初始化并在其中使用它,您就可以在服务中获取应用程序上下文(getApplicationContext()
)。然后,由于共享首选项可以从应用程序中的任何位置访问,因此您可以检索数据。谢谢。这肯定是一种更好的方法。这是否意味着如果不再使用活动,您会在服务事件中保留活动的实例?它不会产生泄漏?就是这样:您需要调用一个方法来删除活动对onDestroy()
或onResume()
方法的引用,如下所示:public void unbindCallback(){mCallback=null;}
谢谢。这肯定是一种更好的方法。这是否意味着如果不再使用活动,您会在服务活动中保留活动实例?它不会产生泄漏?就是这样:您需要调用一个方法来删除活动对onDestroy()
或onResume()
方法的引用,如下所示:public void unbindCallback(){mCallback=null;}