参考资料http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0418/4158.htmlhttp://blog.csdn.net/coding_glacier/article/details/7520199 底层实现

一、AIDL的理解

AIDL:Android Interface Definition Language,即Android接口定义语言,这是一种用于Android的跨进程通信(IPC)的工具。
在android中一个进程不允许直接访问另一个进程的内存的,也就是说不能访问另一个进程中的应用。在android中允许有多进程,因此多进程通信可以在自己的应用中进行通信,也可以在不同应用中通信,而这便是AIDL的使用方向。但是AIDL有个缺点,那就是比较耗资源。
使用aidl进行通信,通常有服务端和客户端的概念

二、如何使用AIDL

1.首先要在main目录下建立一个aidl文件夹

Android 使用AIDL实现守护进程_第1张图片 Paste_Image.png

2.在aidl文件夹下创建一个aidl文件

Paste_Image.png Android 使用AIDL实现守护进程_第2张图片 Paste_Image.png

3.模拟一个服务端,使用:服务名称 的方式创建一个服务

Paste_Image.png

4.远程服务负责创建aidl接口

1.在远程服务中,创建Binder对象。使用Stub()方法创建

Android 使用AIDL实现守护进程_第3张图片 Paste_Image.png

2.在onBind中返回该对象

Paste_Image.png

5.客户端接入
1.将服务端保存AIDL文件的包名原封不动的复制,并且在client的AIDL文件夹下建立相同的包,并考入AIDL文件
(包名必须要相同,可以将包原封不动的拷贝到客户端)
2.使用bind启动的方式绑定远程服务,和远程服务建立关系

Intent serviceIntent = new Intent(); //通过包名显示的启动一个Service 第一个参数为app的包名 第二个为app中Service的全路径 serviceIntent.setComponent(new ComponentName("com.tjpld.aidlservicetest", "com.tjpld.aidlservicetest.AppService"));bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

3.ServiceConnection中客户端创建aidl对象

Android 使用AIDL实现守护进程_第4张图片 Paste_Image.png

4.客户端调用aidl中定义好的方法,向服务端写入值
加入我们在aidl中定义的方法是:setData(String data),那么在使用时:

Android 使用AIDL实现守护进程_第5张图片 Paste_Image.png

进程包活(灰色保活+守护进程)

灰色保活:它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到Notification),但你的进程优先级又是高于普通后台进程的(因为实际上他是通过startForeground开启的一个前台进程)。

Android 使用AIDL实现守护进程_第6张图片 Paste_Image.png

大于18的时候


Android 使用AIDL实现守护进程_第7张图片 Paste_Image.png

双守护进程
1.思路就是两个进程的服务互相监听,当一个服务启动后,立即启动和绑定另一个服务,并且互相监听,当其中一个发现另一个服务断开时,立即启动断开的服务并且重新绑定。

假设有两个服务:LocalService,RemoteServcie
在LocalService中:
(1)启动时立即绑定远程服务:

Android 使用AIDL实现守护进程_第8张图片 Paste_Image.png
(2)监听远程服务:

Android 使用AIDL实现守护进程_第9张图片 Paste_Image.png
在RemoteService中同样:

Android 使用AIDL实现守护进程_第10张图片 Paste_Image.png Android 使用AIDL实现守护进程_第11张图片 Paste_Image.png

低层实现

总结了链接文章中的内容
1.Binder机制:client-server的通信结构。client在请求和server通信时,首先会去差serviceManager中是否有这个service,有的话service通过bind-driver提供一份对应service的代理,client不会直接操作server的方法 而是通过操作server对应的代理对象,代理对对象有和server一样的方法。client向server发送数据时打包成parcel包,交给bind-driver。每个server都由serviceManage管理,注册在serviceMananger中。serviceManager会不断查询bind-driver中是否有数据发给指定的service。client端向service发送数据时会bpbinder对象,调用它的onTrance方法向binddriver里写入数据,service在会有一个bnbinder调用onTrancact方法解包数据,调用service对应的方法。

更多相关文章

  1. Android中向服务器发送数据的Post和Get方法
  2. 图片旋转的两种方法
  3. Android 使用颜色矩阵改变图片颜色,透明度,亮度
  4. android 显示gif格式的图片
  5. android sdk 兼容低版本的处理方法
  6. 详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存
  7. OOM的出现及解决(加载图片)
  8. Android后端服务器的搭建方法

随机推荐

  1. android 获取局域网内其他手机的ip
  2. set androids action bar title color
  3. Android(安卓)R(11)targetSdkVersion 30的
  4. Android 搜索到的关键字改变颜色
  5. Android 异常:Immutable bitmap passed to
  6. Dalvik Optimization and Verification W
  7. 修改Android系统目录的读写权限命令
  8. Android getWindow().setFlags方法
  9. 老外写的在桌面添加快捷方式(DELPHI XE5 A
  10. [置顶] Android列表收缩与展开仿QQ好友列