Android用AIDL创建Service

定义AIDL接口,创建Service,创建客户端Activity通过AIDL调用远程Service…

官网任玉刚大神

接下来是我的实践

Server服务端创建

定义一个简单aidl接口

在工程上右键新建AIDL文件,填写文件名,比如我的就是IMyAidlInterface,里面有一个自动生成的函数是展示一些你可以在AIDL中使用的一些类型值。添加一个add函数如下。
  AIDL接口

接下来Rebuild工程,你就会发现app/build/gnerated/source/aidl/下会有系统为你创建的对应接口的java接口文件。它继承自IInterface,含有我们创建的add方法。并含有一个实现了IMyAidlInterface的静态内部类stub.如下。

关于stub的一些介绍:
asInterface:将一个IBinder对象转换成IMyAidlInterface接口。如果在同一进程则返回的是本地Binder,否则返回的是Binder代理对象。如果对Binder有疑惑可以看下此篇文章http://weishu.me/2016/01/12/binder-index-for-newer/。

onTransact : 会发现刚才创建的add函数自带的basicType函数均在里面。进行数据的序列化传输,传给Binder驱动,驱动完成后在序列化读取。

Proxy:当service和client位于不同的进程时,调用asInterface返回的就是此代理对象。
    sdk生成接口java文件
IMyAidlInterface.java代码就不贴了

创建Service

创建自己的service继承自Service你可以手动创建也可以直接在工程右键创建.记得配置AndroidManifest.

注意:你需要在OnBind()函数里返回一个IMyAidlInterface.Stub对象的子类,即首先你需要创建自己的Stub子类并实现add方法,如下我只是简单相加。返回的子类将在ServiceConnection对象中获得下面会讲到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MyAidlService extends Service {
private MyAidlBinder myAidlBinder;

public class MyAidlBinder extends IMyAidlInterface.Stub{
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

}

@Override
public int add(int a, int b) throws RemoteException {
return a+b;
}
}

public MyAidlService() {
}

@Override
public void onCreate() {
super.onCreate();
myAidlBinder = new MyAidlBinder();
}

//onBind返回的IBinder对象要是IMyAidlService.Stub的子类的实例
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
return myAidlBinder;
}
}

创建Acticity

让服务端可以启动。简单配置显示”Serve”(添加一个TextView即可).

Client客户端创建

添加AIDL

首先将服务端的Aidl文件服务过来,注意Aidl文件包名必须相同,如下所示。
客户端田间AIDL文件

创建Activity

  1. 创建ServiceConnection对象实现onServiceConnected方法获取OnBind方法传递过来的Service,并调用IMyAidlInterface.Stub.asInterface(service)方法转换为IMyAidlInterface接口。
  2. 调用add方法获取值,并展示。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class MainActivity extends AppCompatActivity {
    public static String TAG="MainActivity:";
    private IMyAidlInterface myAidlServive;

    private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    myAidlServive = IMyAidlInterface.Stub.asInterface(service);
    if(myAidlServive ==null) System.out.println(TAG+"myAidlServive==null");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
    myAidlServive = null;
    }
    };

    //wight
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button)findViewById(R.id.bt);
    textView = (TextView)findViewById(R.id.tv);

    //创建所需要绑定的Service的Intent
    Intent intent = new Intent();
    intent.setAction("com.example.chenfeng.binderstudy.AIDL_SERVICE");
    intent.setPackage("com.example.chenfeng.binderstudy");
    //绑定远程服务
    bindService(intent,connection, Service.BIND_AUTO_CREATE);

    //点击进行Binder通信,获取值
    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    try {
    button.setText(String.valueOf(myAidlServive.add(5,3)));
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    }
    });
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    this.unbindService(connection);
    }
    }

效果图:
效果图
附件:源代码

不足之处,请多多指教!
转载请注明出处@author:chenfengkg

-------------本文结束感谢您的阅读-------------
鼓励鼓励!