开发的项目中使用aidl 场景并不多,主要场景有 :
1,为了使某页面 运行更流畅和申请更大内存而使用的场景
Messenger 使用方式
当我们启动 社区页面后【CommunityContentDetailActivity 类】,指定的进程为: android:process=":community_content"
它中有一个CommunityContentDetailFragment 当单击Fragment页面中的【进入聊天室按钮】后,会查询 用户登录状态然后根据用户登录信息,
启动聊天室页面 ,由于该进程中不存储登录状态的,所以需要 跨进程回调到 app默认进程, 由默认进程中的线程去判断用户登录状态,然后调起 聊天室页面 。
所以此处需要 社区进程 去 绑定 app 默认进程, 然后给 app 进程 发消息去 启动 聊天室 页面 。
![](https://img.haomeiwen.com/i2598119/52d31e91cbbca727.png)
Messenger 的构造方法
//本地Messenger
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
//运程 Messenger
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
//Messenger 发送消息
public void send(Message message) throws RemoteException {
mTarget.send(message);
}
具体代码:
//社区进程 的 回调 Messenger
private Messenger clientMessenger = new Messenger(new ClientHandler());
private class ClientHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Log.i(GotoChatRoomService.TAG, "ClientHandler -> handleMessage");
if(msg.what == RECEIVE_MESSAGE_CODE){
Bundle data = msg.getData();
if(data != null){
LoggerHelper.i(GotoChatRoomService.TAG, " client receive msg : " + data);
}
}
}
}
//绑定的代码
public void bindServer(){
Intent intent = new Intent();
intent.setAction(GotoChatRoomService.KEY_CLASS_NAME);
intent.addCategory(Intent.CATEGORY_DEFAULT);
PackageManager pm = mActivity.getPackageManager();
ResolveInfo info = pm.resolveService(intent, 0);
if(info != null){
String packageName = info.serviceInfo.packageName;
String serviceNmae = info.serviceInfo.name;
ComponentName componentName = new ComponentName(packageName, serviceNmae);
intent.setComponent(componentName);
try{
LoggerHelper.i(GotoChatRoomService.TAG, "bindServer");
mActivity.bindService(intent, mConn, BIND_AUTO_CREATE);
}catch(Exception e){
e.printStackTrace();
LoggerHelper.e(GotoChatRoomService.TAG, e.getMessage());
}
}
}
//绑定成功的回调
private ServiceConnection mConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
LoggerHelper.i(GotoChatRoomService.TAG, " onServiceConnected");
mServiceMessenger = new Messenger(binder);
mIsBoundSuccess = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mServiceMessenger = null;
mIsBoundSuccess = false;
LoggerHelper.i(GotoChatRoomService.TAG, " onServiceDisconnected");
}
};
//进程调用 app 默认进行的 的方法
public void sendMessage(GoChatRoom goChatRoom){
if (mIsBoundSuccess && mServiceMessenger != null){
Message msg = Message.obtain();
msg.what = SEND_MESSAGE_CODE;
Bundle data = new Bundle();
data.putParcelable(GotoChatRoomService.KEY_MSG_ONE,goChatRoom);
msg.setData(data);
msg.replyTo = clientMessenger;
try {
LoggerHelper.i(GotoChatRoomService.TAG, "sendMessage");
mServiceMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
LoggerHelper.i(GotoChatRoomService.TAG, "sendMessage error: " + e.getMessage());
}
}
}
//app默认进程的 服务
public class GotoChatRoomService extends Service {
public static final String TAG = "GotoChatRoomService";
public static final String KEY_CLASS_NAME = "xxx.GotoChatRoomService";
public static final String KEY_MSG_ONE = "1";
private static final int RECEIVE_MESSAGE_CODE = 0x0001;
private static final int SEND_MESSAGE_CODE = 0x0002;
private Messenger mClientMessenger = null;
private Messenger mServiceMessenger = new Messenger(new ServiceHandler());
private class ServiceHandler extends Handler {
@Override
public void handleMessage(Message msg) {
LoggerHelper.i(TAG, "ServiceHandler -> handleMessage");
if(msg.what == RECEIVE_MESSAGE_CODE){
Bundle data = msg.getData();
data.setClassLoader(getClass().getClassLoader());
if(data != null){
GoChatRoom goChatRoom = data.getParcelable(KEY_MSG_ONE);
LoggerHelper.i(TAG, "goChatRoom : " + goChatRoom);
if (goChatRoom != null){
ObserverManager.notify(goChatRoom);
}
}
}
}
}
@Override
public void onCreate() {
LoggerHelper.i(TAG, "GotoChatRoomService -> onCreate");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
LoggerHelper.i(TAG, "GotoChatRoomService -> onBind");
return mServiceMessenger.getBinder();
}
@Override
public void onDestroy() {
LoggerHelper.i(TAG, "GotoChatRoomService -> onDestroy");
mClientMessenger = null;
super.onDestroy();
}
}
// 数据bean 需要实现parc接口
2, 开发支付插件时使用 aidl
![](https://img.haomeiwen.com/i2598119/a42d4d984287ee3f.png)
模拟客户端
手机银行app
手机银行支付插件
支付流程
模拟客户端 就是一个activity页用 ,用户可以去选择支付环境为生产还是测试,打开后用webview 加载一个网页(网页中包含 支付的 订单信息)。 单击网页中的按钮, js调用 原生方法,并把支付参数,传递给客户端, 客户端解析 数据的方式为 messageB64 = new String(Base64.decode(parseXML("<b64xml>", "</b64xml>")), "GBK") ,
解析支付参数后,进行数据的组装, 然后选择调用 app 客户端支付 或 插件支付, 当选择了其中一个后, 退可开启 IPC 支付通信
网友评论