文档章节

Android学习(四)Binder Client

lipandroid
 lipandroid
发布于 2015/09/14 15:03
字数 899
阅读 15
收藏 0

Binder Client

有了Binder DriverServiceManager以及Android系统专门面对应用开发提供的Binder封装,才能使应用程序之间顺利进行无缝通信。从四大组建中可以看出:

  • Activity:通过startActivity可以启动目标进程

  • Service:任何应用程序都可以通过startServicebindService来启动特定服务

  • Broadcast:任何应用程序都可以通过sendBroadcast来发送一个广播,且无论广播处理是否在同一进程中

  • Intent

bindService启动Service的步骤:

  1. 应用程序填写Intent,调用bindService发送请求

  2. 收到请求的bindService(此时还在应用程序的运行空间)将与ActivityManagerServiceAMS)取得联系。为了获得AMSBinder句柄,事先调用ServiceManager.getService,这里就涉及到进程间通信了。在得到AMS的句柄后,程序才能真正向它发送请求。

  3. AMS基于特定的最有匹配策略,从其内部存储的系统所有服务组件中找到与Intent最匹配的一个,然后向它发送Service绑定请求。如果目标进程还不存在的话,AMS还要负责把它启动。

  4. “被绑定”的服务进程需响应绑定,执行具体操作,并在成功后通知AMS。再由AMS回调发起请求的应用程序(回调接口是ServiceConnection)。

Context的相关继承关系:

Activity继承关系的“根”是ContextbindService即包含在Context中,Context只是提供了抽象的接口:

/*\Android4.4\frameworks\base\core\java\android\content\Context.java*/

    public abstract boolean bindService(Intent service, ServiceConnection conn,

            int flags);

具体实现在ContextWrapper中:

/*\Android4.4\frameworks\base\core\java\android\content\Context.java*/

    @Override

    public boolean bindService(Intent service, ServiceConnection conn,

            int flags) {

        return mBase.bindService(service, conn, flags);

    }

mBase也是一个Context对象,ContexImpl实现(这里暂时留下疑问),bindService的实现如下:

/*\Android4.4\frameworks\base\core\java\android\app\ContextImpl.java*/

    @Override

    public boolean bindService(Intent service, ServiceConnection conn,

            int flags) {

        warnIfCallingFromSystemProcess();

        return bindServiceCommon(service, conn, flags, Process.myUserHandle());

    }

 

    /** @hide */

    @Override

    public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,

            UserHandle user) {

        return bindServiceCommon(service, conn, flags, user);

}

 private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,  UserHandle user) {

            int res = ActivityManagerNative.getDefault().bindService(

                mMainThread.getApplicationThread(), getActivityToken(),

                service, service.resolveTypeIfNeeded(getContentResolver()),

                sd, flags, user.getIdentifier());

}

 

ServiceManager一样,AMS也同样提供了ActivityManagerNativeActivityManagerProxy

/*\Android4.4\frameworks\base\core\java\android\app\ActivityManagerNative.java*/

    static public IActivityManager getDefault() {

        return gDefault.get();

}

    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {à单实例,对象只被创建一次

        protected IActivityManager create() {

            IBinder b = ServiceManager.getService("activity");à通过ServiceManager取得AMSIBinder对象

            if (false) {

                Log.v("ActivityManager", "default service binder = " + b);

            }

            IActivityManager am = asInterface(b);à创建一个可用的ActivityManagerProxy

            if (false) {

                Log.v("ActivityManager", "default service = " + am);

            }

            return am;

        }

    };

ActivityManagerNative的作用之一,就是帮助调用者快速取得一个ActivityManagerProxy

 

ActivityManagerProxy中有bindService的实现:

/*\Android4.4\frameworks\base\core\java\android\app\ActivityManagerNative.java*/

public ActivityManagerProxy(IBinder remote)à构造函数中remote是上面通过ServiceManager.getService("activity");获取的

    {

        mRemote = remote;

    }  

 public int bindService(IApplicationThread caller, IBinder token,

            Intent service, String resolvedType, IServiceConnection connection,

            int flags, int userId) throws RemoteException {

        Parcel data = Parcel.obtain();

        Parcel reply = Parcel.obtain();

        data.writeInterfaceToken(IActivityManager.descriptor);

        data.writeStrongBinder(caller != null ? caller.asBinder() : null);

        data.writeStrongBinder(token);

        service.writeToParcel(data, 0);

        data.writeString(resolvedType);

        data.writeStrongBinder(connection.asBinder());

        data.writeInt(flags);

        data.writeInt(userId);

        mRemote.transact(BIND_SERVICE_TRANSACTION, data, reply, 0);

        reply.readException();

        int res = reply.readInt();

        data.recycle();

        reply.recycle();

        return res;

   

 

ActivityManagerNative的另一个作用是为ActivityManagerService的实现提供便利。可见在ActivityManagerNative中有如下代码:

/*\Android4.4\frameworks\base\core\java\android\app\ActivityManagerNative.java*/

    @Override

    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)

            throws RemoteException {

        switch (code) {

        case START_ACTIVITY_TRANSACTION:

        {

            data.enforceInterface(IActivityManager.descriptor);

            IBinder b = data.readStrongBinder();

            IApplicationThread app = ApplicationThreadNative.asInterface(b);

            String callingPackage = data.readString();

            Intent intent = Intent.CREATOR.createFromParcel(data);

            String resolvedType = data.readString();

            IBinder resultTo = data.readStrongBinder();

            String resultWho = data.readString();

            int requestCode = data.readInt();

            int startFlags = data.readInt();

            String profileFile = data.readString();

            ParcelFileDescriptor profileFd = data.readInt() != 0

                    ? data.readFileDescriptor() : null;

            Bundle options = data.readInt() != 0

                    ? Bundle.CREATOR.createFromParcel(data) : null;

            int result = startActivity(app, callingPackage, intent, resolvedType,

                    resultTo, resultWho, requestCode, startFlags,

                    profileFile, profileFd, options);

            reply.writeNoException();

            reply.writeInt(result);

            return true;

        }

}

ActivityManagerService继承自ActivityManagerNative,所以ActivityManagerNative既是面向调用者,也是面向服务本身的。

ActivityManagerService的内容异常繁杂,内容还有很多,暂时先学习到这里,与ServiceManager发生了联系。

 

© 著作权归作者所有

lipandroid
粉丝 1
博文 19
码字总数 20690
作品 0
武汉
私信 提问
知识总结 插件化学习 Binder机制原理

Binder是android系统特有IPC方式,安卓平台中的各种服务交互基本都是Binder机制实现,理解和掌握Binder机制的实现原理可有效提升软件性能优化点,同时Binder机制的应用也是动态代理方式实现插...

常兴E站
2017/06/05
0
0
android Binder 工作流程

一.Linux系统进程间通信有哪些方式? 1.socket; 2.name pipe命名管道; 3.message queue消息队列; 4.singal信号量; 5.share memory共享内存; 二.Java系统的通信方式是什么? 1.socket; ...

eric_zhang
2011/07/20
4.5K
0
Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 看下Java层一个方法在c++层 MediaPlayer后续过程 frameworks/av/media/libmedia/MediaPlayer.cpp 找一个我们之前熟悉的setDa...

天王盖地虎626
01/19
17
0
02.Android之IPC机制问题

目录介绍 2.0.0.1 什么是Binder?为什么要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么? 2.0.0.2 Android中进程和线程的关系?什么是IPC?为何需要进行IPC?多进程通信...

潇湘剑雨
01/07
31
0
听说你Binder机制学的不错,来面试下这几个问题(一)

Binder承担了绝大部分Android进程通信的职责,可以看做是Android的血管系统,负责不同服务模块进程间的通信。在对Binder的理解上,可大可小,日常APP开发并不怎么涉及Binder通信知识,最多就...

技术小能手
2018/07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
10
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
23
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部