android接口定义语言,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文件

cc7466d97827

2.文件目录会增加AIDL文件夹和你刚增加的文件

cc7466d97827

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文件,然后不用管了,改天再细说这个文件

cc7466d97827

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,让其运行在不同进程:

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.看看打印的线程和返回的数值:

cc7466d97827

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值