adnroid四大组件之Service 绑定服务,数据通信-IBinder

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了adnroid四大组件之Service 绑定服务,数据通信-IBinder相关的知识,希望对你有一定的参考价值。

绑定服务:

  第一步:创建一个服务类,实现onBind() 方法, 返回一个IBinder对象,

这个对象定义了与服务通信的接口,客户端接收到这个IBinder,与服务进行

通信。  IBinder的实现类通过一个 方法用来获取服务,和onTransact方法

与客户端进行通信。

  第二步:在清单文件注册服务<service>

     <service android:name="com.example.bindservicedemo.BindService"></service>

  第三步: 客户端通过ServiceConnection来获取服务,和IBinder, 

通过IBinder来进行通行。

  

public class BindService extends Service {
    public void onCreate() {
        Log.i("tag", "onCreate()");
    };
     
    @Override//返回一个IBinder对象,供客户端接收,与服务进行通信
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        String title = intent.getStringExtra("title");
        Log.i("tag", "onBind()》》》》"+title);
        return new MyBinder();
    }
    @Override//解除绑定
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i("tag", "onUnbinds()");
        return super.onUnbind(intent);
    }
    @Override
    public void onDestroy() {//销毁服务
        // TODO Auto-generated method stub
        Log.i("tag", "onDestroy()");
        super.onDestroy();
    }
    /**
     * 提供一个外部访问的方法
     * @return
     */
    public int getRandom() {
        Random random = new Random();
        return random.nextInt(100);
    } 
    /**
     * 定义一个Binder的实现类,进行通信的接口,
     * 功能:
     *        获取服务  getService()
     *       数据通信 onTransact()
     */
    public class MyBinder  extends Binder{
        /**
         * 提供获取服务的方法
         */
        public BindService getService() {
            return BindService.this;
        }
        
        @Override//数据通信
        protected boolean onTransact(int code, Parcel data, Parcel reply,
                int flags) throws RemoteException {
             /**
              * 接收客户端的数据
              */
            int age = data.readInt();
            String name = data.readString();
            Log.i("tag", "接收到客户的数据:"+name+"已经"+age+"岁");
            /**
             * 回复数据
             */
            reply.writeInt(1324);
            reply.writeString("raise");
            return super.onTransact(code, data, reply, flags);
        }
    };

}

 客户端:

  Binder是一个远程传输的对象,是轻量级的远程传输机制的核心。

用户简单地数据通信

public class MainActivity extends Activity {
    private MyBinder myBinder ;
    private BindService bindService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
    }
    /**
     * 绑定服务的事件监听
     */
    public void doBindService(View v){
        Intent intent = new Intent(MainActivity.this, BindService.class);
        intent.putExtra("title", "土豆、土豆,我是地瓜");
        //绑定服务
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    public void doUnBindService(View v) {
        ///解除绑定服务
        unbindService(conn);
    } 
    /**
     * 调用service中定义的方法
     * @param v
     */
    public void getServiceMethod(View v) {
        if(bindService != null){
            bindService.getRandom();
        }
    }
    /**
     * 数据通信事件通信
     */
    public void onProgressConn(View v) {
           //传数据    Parcel 是一个序列化对象,
        Parcel out = Parcel.obtain();
        out.writeInt(23);
        out.writeString("jack");
        //接收数据
        Parcel in = Parcel.obtain();
        try {
            myBinder.transact(IBinder.LAST_CALL_TRANSACTION, out, in, 0);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        int age = in.readInt();
        String name = in.readString();
        Log.i("tag", "接收到服务的数据:"+name+"已经"+age+"岁了");
    }
    
    
    

    /**
     * 通过ServiceConnection获取服务和通信接口MyBnder
     */
    public ServiceConnection conn = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            Log.i("tag", "onServiceConnected");
             myBinder = (MyBinder)service;
       bindService = myBinder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            Log.i("tag", "onServiceDisconnected");
        }  
    }; 

}

 

以上是关于adnroid四大组件之Service 绑定服务,数据通信-IBinder的主要内容,如果未能解决你的问题,请参考以下文章

Android四大组件之Service

Android 四大组件之service与Broadcast

Android四大组件之服务

Android四大组件之服务的两种启动方式详解

安卓四大组件之服务服务的生命周期和启动方式

Android应用组件 —— Service