安卓IPC之aidl使用(二)---aidl本地实现

来源:互联网 发布:算法设计与分析王秋芬 编辑:程序博客网 时间:2024/06/03 12:26

安卓IPC之aidl使用(二)—aidl本地实现
安卓IPC之aidl使用(三)—System aidl调用
安卓IPC之aidl使用(一)–aidl常见使用

一直都以为aidl必须写一个服务端是吧,那样岂不是有时候需求怎么实现,如果app的service和client属于同一app,那样实现是不是更好的满足我们的需求呢。
这里写图片描述

本例子我们实现一个很简单的例子:实现2个数相加

// ILocal.aidlpackage com.losileeya.localaidl;// Declare any non-default types here with import statementsinterface ILocal {   int add(in int num1,in int num2);}

因为不需要在写service了,所以我们这里需要写LoaclAidlService

package com.losileeya.localaidl;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;import android.os.RemoteException;import android.support.annotation.Nullable;/** * User: Losileeya (847457332@qq.com) * Date: 2016-07-10 * Time: 11:09 * 类描述: * * @version : */public class LoaclAidlService extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {        return new MBinder();    }  class MBinder extends ILocal.Stub{      @Override      public int add(int num1, int num2) throws RemoteException {          return doAdd(num1,num2);      }  }    private int doAdd(int num1, int num2) {        return num1+num2;    }  public class LocalConnection implements ServiceConnection {       @Override       public void onServiceConnected(ComponentName name, IBinder service) {           service= (IBinder) ILocal.Stub.asInterface(service);       }       @Override       public void onServiceDisconnected(ComponentName name) {           name=null;       }   }}

然后使用也很简单

package com.losileeya.localaidl;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private ILocal iLocal=null;    private EditText etNum1,etNum2,etResult;    private Button btnCalculate;    private LocationConnection connection=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        bindService();    }    private void initView() {        etNum1= (EditText) findViewById(R.id.et_num1);        etNum2= (EditText) findViewById(R.id.et_num2);        etResult= (EditText) findViewById(R.id.et_result);        btnCalculate= (Button) findViewById(R.id.btn_calculate);        btnCalculate.setOnClickListener(this);    }    private void bindService() {        connection=new LocationConnection();        Intent intent=new Intent();        intent.setComponent(new ComponentName("com.losileeya.localaidl","com.losileeya.localaidl.LoaclAidlService"));        bindService(intent,connection, Context.BIND_AUTO_CREATE);    }    class LocationConnection implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            iLocal = ILocal.Stub.asInterface((IBinder)service);        }        @Override        public void onServiceDisconnected(ComponentName name) {            iLocal=null;        }    };    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(connection);        connection=null;    }    @Override    public void onClick(View v) {        int num1=Integer.parseInt(etNum1.getText().toString().trim());        int num2=Integer.parseInt(etNum2.getText().toString().trim());        try {            int result=iLocal.add(num1,num2);            etResult.setText(result+"");        } catch (RemoteException e) {            e.printStackTrace();            etResult.setText("失败");        }    }}

是不是和前面一个例子使用起来没有什么两样,只不过把LoaclAidlService搬到客户端来了(2合一了是吗)。仔细一看,还是有一点的区别,请仔细对照代码自行体会。

清单配置LoaclAidlService

 <service android:name=".LoaclAidlService"            android:process=":remmote">            <intent-filter>                <action android:name="com.losileeya.localaidl.LoaclAidlService"></action>            </intent-filter>        </service>

这里把service 标记为android:process=”:remmote”,这样aidl就能被远程调用了。

效果如下:

demo 传送门:AIDLMaster

2 0
原创粉丝点击