Android AIDL的使用
AIDL用于在多个进程之间进行通信。类似功能的有
1. Bundle
2. 文件共享
3. Messenger
4. ContentProvider
5. Socket
今天我们主要来讲一下AIDL的使用,我会分别在Eclipse中和Android Studio中来演示。
ps:建议还在使用Eclipse的不伙伴赶紧换成Android Studio吧,不要跟我一样
Eclipse篇
进程间通信肯定有一个客户端帮一个服务端,我们先来写服务端。首先,在eclipse中新建一个Android工程,名为:aidlserver,然后创建一个包名:com.aidl.server,在它的下面创建aidl文件,这里我们叫做IMyInterface.aidl。它里面非常简单,只有一个返回名字的方法定义。
interface IMyInterface {
String getName();
}
保存之后,eclipse会在gen文件夹下自动为我们生成IMyInterface.java文件,
然后我们需要编写Service,
public class AidlService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
class MyBinder extends IMyInterface.Stub {
@Override
public String getName() throws RemoteException {
return "xiaoming";
}
}
}
项目结构如下图:
不要忘了,我们的service要在清单文件中注册,而且还要定义一个action,一会在客户端会用到。
action我们自己可以随便定义
<service android:name="com.aidl.server.AidlService">
<intent-filter>
<action android:name="com.aidl"></action>
</intent-filter>
</service>
下面我们来编写客户端。首先我们要把服务端定义的aidl文件连同它的包名,一块复制到客户端
注意客户端存放aidl文件的包名和服务端一定要一致,否则无法建立连接。
然后我们在客户端的MainActivity中绑定远程service。
Intent intent = new Intent("com.itheima");
intent.setPackage("com.aidl.server");
bindService(intent, this, Context.BIND_AUTO_CREATE);
注意:android5.0以后无法通过隐式调用启动service,所以必须设置包名
客户羰完整代码如下:
public class MainActivity extends Activity implements ServiceConnection {
private IMyInterface mInterface;
/**
* 用来判断连接是否已经建立成功
*/
private boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent("com.itheima");
intent.setPackage("com.aidl.server");
bindService(intent, this, Context.BIND_AUTO_CREATE);
}
/**
* Button按键的点击事件
*
* @param view
*/
public void click(View view) {
if (flag) {
try {
Toast.makeText(this, mInterface.getName(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
Toast.makeText(getApplication(), "正在绑定,请稍候。。。", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(this);
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mInterface = IMyInterface.Stub.asInterface(service);
flag = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
flag = false;
}
}