如何从 activity 访问服务变量
How to access a variable of a service from an activity
我了解,为了从 activity 访问服务的方法,我们应该绑定该服务。
但是如果我们只是想获取服务中某个变量的值,是否可以不绑定直接访问?
int myActivityVar = myService.myServiceVar;
它有效,但我不确定它是否有任何内存泄漏影响或任何其他问题。
解决方案
Activity
会发送一个BroadcastReceiver给Service
请求获取数据。
Service
会注册BroadcastReceiver
,当收到来自Activity
的广播消息时,它会准备结果数据并将其发送回Activity
通过使用 ResultReceiver.
实施
MyService.java
public class MyService extends Service {
public static final String ACTION_GET_DATA = "ACTION_GET_DATA";
public static final String EXTRA_RECEIVER = "EXTRA_RECEIVER";
public static final String EXTRA_DATA = "EXTRA_DATA";
public static final int RESULT_OK = 1;
public static final int RESULT_FAILED = 0;
// The data of the Service that the Activity want to access.
private int myServiceVar = 100;
private final BroadcastReceiver onGetDataReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Send result data to the activity
ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
Bundle resultData = new Bundle();
resultData.putInt(EXTRA_DATA, myServiceVar);
receiver.send(RESULT_OK, resultData);
}
};
@Override
public void onCreate() {
super.onCreate();
registerReceiver(onGetDataReceiver, new IntentFilter(ACTION_GET_DATA));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO: Your code logic goes here.
return Service.START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
MainActivity.java
private void getDataFromService() {
Handler mainHandler = new Handler(Looper.getMainLooper());
ResultReceiver receiver = new ResultReceiver(mainHandler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == MyService.RESULT_OK) {
int data = resultData.getInt(MyService.EXTRA_DATA);
Log.i(TAG, "Received data = " + data);
}
}
};
Intent intent = new Intent(MyService.ACTION_GET_DATA);
intent.putExtra(MyService.EXTRA_RECEIVER, receiver);
sendBroadcast(intent);
}
我了解,为了从 activity 访问服务的方法,我们应该绑定该服务。
但是如果我们只是想获取服务中某个变量的值,是否可以不绑定直接访问?
int myActivityVar = myService.myServiceVar;
它有效,但我不确定它是否有任何内存泄漏影响或任何其他问题。
解决方案
Activity
会发送一个BroadcastReceiver给Service
请求获取数据。Service
会注册BroadcastReceiver
,当收到来自Activity
的广播消息时,它会准备结果数据并将其发送回Activity
通过使用 ResultReceiver.
实施
MyService.java
public class MyService extends Service {
public static final String ACTION_GET_DATA = "ACTION_GET_DATA";
public static final String EXTRA_RECEIVER = "EXTRA_RECEIVER";
public static final String EXTRA_DATA = "EXTRA_DATA";
public static final int RESULT_OK = 1;
public static final int RESULT_FAILED = 0;
// The data of the Service that the Activity want to access.
private int myServiceVar = 100;
private final BroadcastReceiver onGetDataReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Send result data to the activity
ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
Bundle resultData = new Bundle();
resultData.putInt(EXTRA_DATA, myServiceVar);
receiver.send(RESULT_OK, resultData);
}
};
@Override
public void onCreate() {
super.onCreate();
registerReceiver(onGetDataReceiver, new IntentFilter(ACTION_GET_DATA));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO: Your code logic goes here.
return Service.START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
MainActivity.java
private void getDataFromService() {
Handler mainHandler = new Handler(Looper.getMainLooper());
ResultReceiver receiver = new ResultReceiver(mainHandler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == MyService.RESULT_OK) {
int data = resultData.getInt(MyService.EXTRA_DATA);
Log.i(TAG, "Received data = " + data);
}
}
};
Intent intent = new Intent(MyService.ACTION_GET_DATA);
intent.putExtra(MyService.EXTRA_RECEIVER, receiver);
sendBroadcast(intent);
}