在日常的工作,fragment(或者Activity)中经常会用到service中的数据,因此之间数据通信显得尤为重要。
总共有三种方式

1. 绑定服务,通过ServiceConnection类

  1. 让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) {

        }
    }
  1. 建立好一个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内部实现
  1. 首先添加一个公开的Callback接口,通过Activity来实现该接口
public interface Callback{
    void onDataChange(String data);
}
  1. 新建一个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);
        });
    }
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐