美文网首页
使用过 aidl 的方式

使用过 aidl 的方式

作者: fyg | 来源:发表于2020-09-10 21:04 被阅读0次

开发的项目中使用aidl 场景并不多,主要场景有 :

1,为了使某页面 运行更流畅和申请更大内存而使用的场景

Messenger 使用方式

当我们启动 社区页面后【CommunityContentDetailActivity 类】,指定的进程为: android:process=":community_content"
它中有一个CommunityContentDetailFragment 当单击Fragment页面中的【进入聊天室按钮】后,会查询 用户登录状态然后根据用户登录信息,
启动聊天室页面 ,由于该进程中不存储登录状态的,所以需要 跨进程回调到 app默认进程, 由默认进程中的线程去判断用户登录状态,然后调起 聊天室页面 。
所以此处需要 社区进程 去 绑定 app 默认进程, 然后给 app 进程 发消息去 启动 聊天室 页面 。

社区页跨进程1.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

异度支付插件.png

模拟客户端

手机银行app

手机银行支付插件

支付流程

模拟客户端 就是一个activity页用 ,用户可以去选择支付环境为生产还是测试,打开后用webview 加载一个网页(网页中包含 支付的 订单信息)。 单击网页中的按钮, js调用 原生方法,并把支付参数,传递给客户端, 客户端解析 数据的方式为 messageB64 = new String(Base64.decode(parseXML("<b64xml>", "</b64xml>")), "GBK") ,
解析支付参数后,进行数据的组装, 然后选择调用 app 客户端支付 或 插件支付, 当选择了其中一个后, 退可开启 IPC 支付通信

相关文章

  • 使用过 aidl 的方式

    开发的项目中使用aidl 场景并不多,主要场景有 : 1,为了使某页面 运行更流畅和申请更大内存而使用的场景 M...

  • 安卓AIDL

    Android Interface Definition Language(AIDL) AIDL与您可能使用过的其...

  • 第十八周 AIDL

    话题:AIDL Android 中 AIDL 的作用是什么?它所支持的参数类型是?默认情况下 AIDL 的调用过程...

  • [转]Android 接口定义语言 (AIDL)

    Android 接口定义语言 (AIDL) Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语...

  • AIDL 双向调用的注意事项

    之前没有实战用过AIDL,最近用的时候稍微麻烦了一些。 预警:本文不适合做AIDL教程... 总结如下: AIDL...

  • 手写AIDL 了解binder在java层的实现

    AIDL是什么 Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似。您可以...

  • AIDL学习

    AIDL AIDL的核心有两点 AIDL是一种跨进程通讯方式这种方式是基于Binder机制来进行的,Binder本...

  • AIDL调用过程

    人无知而无畏,因为自己的无知和傲慢而感到羞愧 看了Android开发艺术探索第二章,总结一哈aidl调用过程 ai...

  • 浅谈AIDL

    今天我们采用WWH(what why how)的方式来复习一遍AIDL。 AIDL是什么 AIDL就是Androi...

  • 再忆Service(二)

    Aidl && Service 0x10 onTransact方式连接 0x20 通过aidl方式连接 在main...

网友评论

      本文标题:使用过 aidl 的方式

      本文链接:https://www.haomeiwen.com/subject/tqoeektx.html