zoukankan      html  css  js  c++  java
  • Win32 COM组件 x Android Service (二)

    继续上一篇。

    如果不使用AIDL(Android Interface Definition Language接口描述语言)编写服务接口的话,(COM组件,CORBA组件,ICE组件以及其它远程调用框架WCF,gsoap都有各自的接口描述语言,目的就是自动生成proxy和stub)。那么就要自己进行比较底层的使用,调用时分别IBinder是Binder还是BinderProxy,如果是Binder的话可以直接向下转换类型调用接口方法,否则就必须使用BinderProxy.transcat来进行远端调用和重写Binder的onTranscat进行调用映射转换。

    转入本篇的正题上,观察 服务x线程x调用x进程x应用程序的关系。

    定义下面5种使用方法,依次使用下面方法。

    应用程序从Launcher启动,应用程序被创建,并收到创建通知。(注意在Linux下不存在真正的线程,线程号与进程号相同的话,就是进程的启动线程,一般也就是主线程)

    先使用第一第二个按钮,分别在主线程和工作线程startService

    然后使用第三个按钮,startService的目标服务放在外部进程。(在Manifest.xml中使用android:process属性)

    最后使用第四第五个按钮,分别在工作线程上bindService,得到IBinder后在onServiceConnected回调中调用接口what。

     现在在我的安卓系统中运行着两个(同样)应用程序(进程),每个应用程序关联着一个服务。

    现在我不关闭服务,在前台任务中将Launcher启动的应用程序关闭会发生什么事呢?

    最后附上Binder.transcat和BinderProxy.transcat代码

    public final boolean transact(int code, Parcel data, Parcel reply,
                int flags) throws RemoteException {
            if (false) Log.v("Binder", "Transact: " + code + " to " + this);
    
            if (data != null) {
                data.setDataPosition(0);
            }
            boolean r = onTransact(code, data, reply, flags);
            if (reply != null) {
                reply.setDataPosition(0);
            }
            return r;
        }
    Binder.transcat
    public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
            Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
            if (Binder.isTracingEnabled()) { Binder.getTransactionTracker().addTrace(); }
            return transactNative(code, data, reply, flags);
        }
    BinderProxy.transcat

     Parcel类负责参数和返回结果的序列化和反序列化。

  • 相关阅读:
    内存溢出和内存泄漏的区别
    java 23种设计模式 深入理解
    关于安装office注册表权限的解决方法
    Tomcat在Linux上的安装与配置
    初窥Linux 之 我最常用的20条命令
    redis使用初体验
    学习进度条——第12周
    找水王
    学习进度条——第11周
    学习进度条——第10周
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/6361925.html
Copyright © 2011-2022 走看看