AIDL:Android接口定义语言浅解
Android Interface Definition Language即AIDL,这个名字好高端:接口定义语言。什么意思?
就是跨进程数据通信的方式,为啥不能直接通信还要搞个这个?
因为所以自然道理,呵呵。
因为他们本来不能通信,为啥不能通信呢?
因为在不同的进程,为什么在不同的进程不能通信呢?
因为每个进程有自己的内存区域存储数据,一个进程不能访问另外一个进程的内存空间,为啥不能访问呢?
因为所以自然道理,去他的自然道理,google不让你访问就是不让你访问,哪来的这么多问号啊?????????????
不过人家谷歌还是讲道理的,不让你访问是因为安全考虑,你能随便进别人家吗,然当不能了,除非人家给你钥匙啊----AIDL
但是话又说回来了,我在自己家(一个app一个进程)干嘛要去别人家?
你不听音乐啊(音乐后台播放),你不微信啊(微信消息推送),你不打电话啊(开启拨打号码,打电话实际上也是一个app应用,当然了这是系统的的跨进程通信,使用的是intent),当然了可以干的事情很多了,你也可以有两个家啊(启动远程service)。
当然了进程间通信(IPC),也可以用Message来实现,message内部也是用AIDL实现的。
如果确实需要IPC,但是无需处理多线程,那么就应该通过Messenger来实现。Messenger保证了消息是串行处理的
在有IPC需求,同时服务端需要并发处理多个请求的时候,使用AIDL才是必要的
我们来自己做把钥匙AILD简单实现
1.新建一个aidl文件
2.文件目录会增加AIDL文件夹和你刚增加的文件
3.这是一个接口,所以你要在里面增加你需要的方法
interface IMyAidlInterface {
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
//增加一个两个参数的方法
int change(int a,int b);
}
4.rebuild一下,系统会帮你新建一个IMyAidlInterface的java文件,然后不用管了,改天再细说这个文件
5.写一个service,里面返回的IBinder对象就是IMyAidlInterface.Stub,实现刚才我们的change(int a, int b)方法。
public class MyService extends Service {
private final IMyAidlInterface.Stub mStub = new IMyAidlInterface.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double
aDouble, String aString) throws RemoteException {
}
@Override
public int change(int a, int b) throws RemoteException {
//打印一下service的进程id
System.out.println("service所在的进程是: " + android.os.Process.myPid());
//返回a,b的和
return a+b;
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mStub;
}
}
6.注册我们的service,让其运行在不同进程:
<service
android:name=".MyService"
android:process=":remote"
android:enabled="true"
android:exported="true"/>
7.activity里面绑定service,然后启动,我们就可以和service通信了
public class MainActivity extends AppCompatActivity {
private IMyAidlInterface serice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setClass(this,MyService.class);
bindService(intent,conn,BIND_AUTO_CREATE);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serice = IMyAidlInterface.Stub.asInterface(service);
try {
int change = serice.change(22, 33);
System.out.println("MainActivity所在的进程是:" +android.os.Process.myPid());
System.out.println("22+33的值是;"+change);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
serice=null;
}
};
}
8.看看打印的线程和返回的数值: