我们都知道,AIDL和android四大组件都能够实现进程间的通讯!
1:Acticity:其跨进程的访问,是需要Intent对象,并startActivity(),同时需要在AndroidMianFest文件中注册,当需要传输数据给时,—->八大基本数据类型传输没有任何限制,但是传输的是对象的时候,其对象封装时必须实现Parcelable或Serializable接口 —->其目的是永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)在数据传输及获取的过程中,避免发生紊乱!
2:Content Provider:用于将程序的数据库(Sqlite)人为地暴露出来!实现一个程序可以对另外一个程序的数据库进行相对用的操作!,例如对数据库的增删查改操作!
3:BroadCast:用于发送和接收广播!实现信息的发送和接收,其注册广播后,就能收到广播,传播速度慢,必须在一定的时间内把事情处理完(onReceive执行必须在几秒内),否则的话系统给出ANR.其属于一种被动的单向的跨进程间的通讯方式!
4:SerVice:在后台长期运行的没有界面的组件。其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC)!Service分为本地服务和远程服务,远程服务就一定要用到AIDL技术实现,因为android的不同应用是在不同的进程中运行的,也是彼此独立的,如果在一个应用中访问另一个应用,也就是调用远程服务,就要把服务端定义的AIDL文件放到客户端,这样才可以实现远程服务调用!
—->官方文档解释AIDL:AlDL—>只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时,你才必须使用AIDL)是处理多线程,多客户端并发访问的,其速度快(系统底层直接是共性内存),性能稳,效率高,!
另外提下:Android中的内容提供者,内容解析者,内容观察者
**内容提供者:**A程序使用ContentProvider暴露出数据,使用的时候,需要在AndroidMianFest中注册,
内容解析者:*B程序使用ContentResolver根据url去查询A程序提供的数据!其主要是通过URI来访问其他的程序的数据,需要使用ContentResolver,指的注意的是,ContentResolver获取的不是实例化对象,是使用的单例模式,resolver = context.getContentResolver();通过resolver.query(uri,null,null,null,null);去查询数据,其第一个uri有固定的格式:开头固定为context://接下来就是第一个程序中的android:authorities,后面的参数也是有第一个程序中的ContentProvider给出的,可以理解为数据库表的名字*
内容观察者:B程序使用ContentObserver去观察A程序中数据的变化—>// 提示一下内容观察者 arg0 URI 对应的数据已经更新了
getContext().getContentResolver().notifyChange(arg0, null);
对于内容观察者的话,主要有几个步骤
首先自定义一个类继承ContentObserver实现里面的方法
然后使用ContentResolver注册监听
- 为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
- notifyForDescendents 为false 表示精确匹配,即只匹配该Uri;为true 表示可以同时匹配其派生的Uri
*/
//注册其内容观察者
resolver.registerContentObserver(uri, false, mObserver);
- notifyForDescendents 为false 表示精确匹配,即只匹配该Uri;为true 表示可以同时匹配其派生的Uri
当然最后在生命周期结束的时候,记得要取消注册,要不然释放不掉会出问题的。。
protected void onDestroy() {
//取消内容观察者的监听
getContentResolver.unregisterContentObserver(mObserver);
MObserver == null;
以上!写的有点乱!大家多见谅!!!!!