Activity或Fragment与service之间数据通信
在日常的工作,fragment(或者Activity)中经常会用到service中的数据,因此之间数据通信显得尤为重要。总共有三种方式:1. 绑定服务,通过ServiceConnection类让Activity实现ServiceConnection接口,并且重写 onServiceConnected 和 onServiceDisconnected两个方法。val serviceConnection
·
在日常的工作,fragment(或者Activity)中经常会用到service中的数据,因此之间数据通信显得尤为重要。
总共有三种方式:
1. 绑定服务,通过ServiceConnection类
- 让Activity实现ServiceConnection接口,并且重写 onServiceConnected 和 onServiceDisconnected两个方法。
val serviceConnection: ServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
//此处写绑定成功后的逻辑,以下代码仅供参考
binder = service as DriverLessService.DriverLessBinder
binder.setOnStatusChangedListener(DriverLessService.OnStatusChangListener { action, value, position ->
dataList[position].showValue = getVehicleStatus(value)
dataAdapter.notifyItemChanged(position)
})
}
override fun onServiceDisconnected(name: ComponentName) {
}
}
- 建立好一个Binder对象,如上,在onServiceConnection中获取到该Binder对象,里面Binder里面的方法,进行数据的通信
//在Service中重写onBind方法
@Override
public IBinder onBind(Intent intent) {
return new DriverLessBinder();
}
//在自定义的Binder中定义获取数据的方法
public class DriverLessBinder extends Binder {
public void setOnStatusChangedListener(OnStatusChangListener listener) {
mListener = listener;
}
}
2.利用Intent进行传值
该方法比较简单,但是只能传递一些简单的值。
3.使用callback接口
- Service内部实现
- 首先添加一个公开的Callback接口,通过Activity来实现该接口
public interface Callback{
void onDataChange(String data);
}
- 新建一个Binder类,在Binder内部定义getMyService()方法用来返回当前MyService的一个对象,让Activity可以添加该事件的绑定
public class Binder extends android.os.Binder{
public void setData(String data){
MyService.this.data = data;
}
public MyService getMyService(){
return MyService.this;
}
}
- 外部Activity添加绑定
首先onServiceConnected()方法,一旦调用该方法,就说明我们的Service与Activity之间绑定成功了。
实现过程:调用setCallback()方法,实现onDataChange()方法。除此之外,由于我们onDataChange()是在子线程中执行【在子线程中更新UI,要使用到Handler】,在此我们使用Handler发送一个Message,在主线程中我们定义了一个Handler,并实现了它的handlerMessage()方法,即将任务从子线程切换到了主线程,让主线程来进行UI操作。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
}
};
//一旦绑定成功就会执行该函数
@Override
public void onServiceConnected(ComponentName componentName,Ibinder iBinder){
myBinder = (MyService.Binder) iBinder;
myBinder.getMyService().setCallback(new MyService.callback() {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("data",data);
msg.setData(b);
handler.sendMessage(msg);
});
}
更多推荐

所有评论(0)