`
anson_xu
  • 浏览: 512951 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

binder理解

阅读更多

Binder理解

 

例子代码:

/** {@hide} */
public abstract class ActivityManagerNative extends Binder implements IActivityManager
{
    /**
     * Cast a Binder object into an activity manager interface, generating
     * a proxy if needed.
     */
    static public IActivityManager asInterface(IBinder obj)
    {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }
       
        return new ActivityManagerProxy(obj);
    }
   
    /**
     * Retrieve the system's default/global activity manager.
     */
    static public IActivityManager getDefault()
    {
        if (gDefault != null) {
            //if (Config.LOGV) Log.v(
            //    "ActivityManager", "returning cur default = " + gDefault);
            return gDefault;
        }
        IBinder b = ServiceManager.getService("activity");
        if (Config.LOGV) Log.v(
            "ActivityManager", "default service binder = " + b);
        gDefault = asInterface(b);
        if (Config.LOGV) Log.v(
            "ActivityManager", "default service = " + gDefault);
        return gDefault;
    }

 

 

如上代码:

通过asInterface(b)可以把b转成IActivityManager 实现ActivityManagerService的一个代理

IActivityManager的实现是ActivityManagerService

class ActivityManagerProxy implements IActivityManager作为ActivityManagerService的一个代理。也实现了IActivityManager接口,应该和ActivityMangerService一样,但同时拥有activityManagerService的应用。

public ActivityManagerProxy(IBinder remote)

    {

        mRemote = remote;

    }

   

    public IBinder asBinder()

    {

        return mRemote;

    }

   调用这个服务实现mRemote做事

启动activity

   Aactivity启动Bactivity的过程描述

 代码如下:

            Intent intent =new  Intent(Aactivity.this, Bactivity.class);

            startActivity(intent);

接下来分析:

1.Acticity.startActivityForResult()      @Aactivity


2.Instrumention.execStartActivity();  @ Insrumention

此类是一个监控类,主要用于监控Activity的生命周期 的执行,比如,什么时候调用了onCreate,什么时候调用了onPause()方法等。


3.ActivityManagerNative.getDefault() .startActivity()
   3.1 ActivityManagerNative.getDefault()返回的是ActivityManagerProxy的实例,
       
它只是一个代理类,这个代理类实际上代理的是IBinder b = ServiceManager.getService("activity");
       
这个Service
  3.2
这个Service是什么时候添加进来的呢?
       
SystemServer.javarun()中有调用
        ActivityManagerService.setSystemProcess();
        ServiceManager.addService("activity", m);
       
这里还会添加许多系统关键服务。
     
TODO:查看在SystemServerLog输出)

  3.3 由于ActivityManagerService是一个系统类,因此访问他要经过一个代理,不能直接访问,而且用代理类访问他,我们可以在访问他以前做一些其它操作,因此ActivityManagerNative.getDefault(),看代码是返回的一个 ActivityManagerProxy类的实例,这个类就是ActivityManagerService的代理类,也就是通过这个类来访问AMS, 代码如下

     static public IActivityManager getDefault() {

          if(gDefault!=null) {

              return gDefault

          }

          IBinder b=ServiceManager.getService("activity"); // ServiceManager进程中获得AMS实例

          gDefault=asInterface(b); // 把获得的AMS实例要通过adInterface接口赋给其代理类

         return gDefault

      }

   再看asInterface() 方法,如下

 

    static public IActivityManager asInterface(IBinder obj) {

       if(obj==null) {

           return null;

       }

       IActivityManager in=(IActivityManager)obj.queryLocalInterface(descriptor);

       if(in!=null) {

          return in;

       }

       return new ActivityManagerproxy(obj);  // 这句就是把AMS的实例当作参数传给了ActivityManagerProxy

                                                               //  因此我们想操作AMS就要通过此代理类来操作,不能直接调用

    }

   因此,ActivityManagerNative.getDefault() .startActivity() 这句代码,实际执行的是

   ActivityManagerProxy类中的startActivity() 方法

 4:我们再分析ActivityManagerProxy

      ActivityManagerProxyActivityManagerNative类的一个内部类,其定义如下:

       class ActivityManagerProxy implements IActivityManager {

            private IBinder mRemote;

            // 构造函数

            public  ActivityManagerProxy(IBinder remote) {

                 mRemote=remote; // 此处就是asInterface方法中定义时把AMS实例传过来的,也就是说

                                             // 此处的mRemote就是ActivityManagerService实例

             }

       }

再分析ActivityManagerProxy中的startActivity方法,定义如下:

public int startActivity(IApplicationThread caller, 

                                Intent intent ,

                                String resolvedType,

                                Uri[] grantedUriPermissions,

                                int grantedMode,

                                IBinder resultTo,

                                String resultWho

                                 int requestCode,

                                boolean onlyIfNeeded,

                                boolean debug)  {

        Parcel data=Parcel.obtain();  //把客户端传递的数据封装一下,然后跨进程传递

        Parcel reply =Parcel.obtain();

        data.writeInterfaceToken(IActivityManage.descriptor); // 保存数据

        ....

        ....

        mRote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);

         // 此句代码很重要,它会把以上所有数据,跨进程传递给ActivityManagerService类中onTrasact方法处理。

       

}

5: 分析ActivityManagerService

      第一个方法是onTrasact() ,来接受客户端传递数据,方法定义如下:

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

          super.onTransact(code ,data  , reply , flags);  // 调用父类ActivityManagerNative中的onTrasact()方法

       }

    onTrasact() 方法主要是接受trasact()方法封装的参数,也就是trasact()函数相当于封包,onTrasact()相当于拆包

    把解析出来的参数,传给ActivityManagerService中的 startActivity()

     ------startActivity()               @ActivityManagerService

     ------startActivityMayWait()   @ActivityManagerService

     ------startActivityLocked()     @ActivityManagerService

     ------startActivityUncheckedLocked() @ActivityManagerService 此方法检查权限,解析Intent中的flag语句

    -------startActivityLocked()   @ActivityManagerService// 与上个方法参数不一样,

   --------resumeTopActivityLocked() @ActivityManagerService

   --------startSpecificActivityLocked  @ActivityManagerService  // 此方法内容会分两部分执行,首先判断activity的进程是否启动,如果已经启动则执行第1种方案,如果没有启动,则启动第2种方案,

   方案1

    --------startProcessLocked ()        @ActivityManagerService

  方案2:

   --------realStartActivityLocked() @ActivityManagerService // 此方法是进入真正启动一个Activity流程

   --------scheduleLaunchActivity () @ActivityThread  @ApplicationThread  // 此方法进入到

                 ApplicationThreadNative提供的服务,也就是到ActivityThread的内部类ApplicationThread类中,

                 这里相当于进入客户端处理了,(到此服务端的Activity实例初始化完毕)

            scheduleLaunchActivity方法定义如下:

           scheduleLaunchActivity (Intent intent, IBinder token, int ident......) {

              ActivityRecord r = new ActivityRecord() ; // 为此Activity定义一个客户端实例

              ....

             queueOrSendMessage(H.LAUNCH_ACTIVITY, r); // 把启动Activity的消息传给一个内部类(H)来处理

              // H类是一个Handler

         }

   --------------handleLaunchActivity   @ ActivityThread

   --------------performLaunchActivity  @ActivityThread   // 此方法开始具体创建Activity,并调用其生命周期

   此方法定义如下 :

         private final Activity performLauchActivity(ActivityRecord r, Intent customIntent)  {

         .....

        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

                                                                       //   通过反射构造出Activity对象

        activity.attach();// 调用Activityattach() 方法, 此方法比较重要,主要创建Activity中的Window

                               // WindowManager  等会儿具体分析

       

         以下会逐渐调用Activity中生命周期的方法

        mInstrumentation.callActivityOnCreate(activity, r.state); // 调用Activity中的onCreate方法

       activity.performStart() ;  // 调用

       mInstrumentation.callActivityOnRestoreInstanceState(activity,r.state);

       mInstrumentation.callActivityOnPostCreate(activity,r.state);

       mActivitys.put(r.token,r);  // 压入栈

       }

--------------handleResumeActivity:  开始调用onResume() 方法,

--------------performResumeActivity(); // 调用onResume()方法

        performResumeActivity () {

           ....

           r.activity.performResume();  // 调用Activity中的onResume方法

           .....

       }

到此为止,整个Activity已经创建,启动了,但是他还什么都没有显示,因为没有显示在屏幕上,

 handleResumeActivity() {

    --r.window.getDecorView();                                   //开始把DecorView添加进Window
    --wm.addView(decor, l);

 }

屏幕上的内容,会显示出来,  至于窗口是怎么创建出来的,那要分析Activity中的Attach()方法了,以后再分析!

6:ActivityWindowView的关系分析,

        

   Android系统中,一个界面可以由两部分组成,

   一:逻辑控制部分:Activity部分

  二:界面显示部分:Window+View 部分,其中主要是View部分

 Activity主要是

分享到:
评论
1 楼 dengzhangtao 2013-01-21  
"由于ActivityManagerService是一个系统类,因此访问他要经过一个代理,不能直接访问"
知道how,但是不知道why?
楼主知道为什么不能直接访问吗,求指教

相关推荐

    Binder 测试Demo客户端

    - 它类似Java接口,但能被编译成Binder理解和使用的二进制格式。 3. **创建服务端接口**: - 在服务端,首先需要定义一个AIDL文件,例如`IMyBinder.aidl`,声明服务提供的方法。 - AIDL文件中的每个方法都会在...

    Binder设计与实现

    理解Binder的工作原理和设计细节对于提升Android应用的性能和安全性至关重要。 1. Binder通信模型与协议 Binder通信模型基于Client-Server架构,其中Client与Server通过Binder驱动进行交互。通信协议定义了数据交换...

    ASP.NET MVC框架开发系列课程(27):辅助普通Web应用程序开发(三)——Model Binder

    这些注解不仅帮助Model Binder理解如何正确地绑定数据,还能生成客户端验证规则,提供更好的用户体验。 本课程可能涵盖了一些关键概念,如: 1. Model Binder的基本工作流程和机制。 2. 如何利用内置的Model Binder...

    android binder 简单实例

    这些代码可以帮助我们理解Binder通信的具体实现,例如如何创建 Binder 代理、如何定义服务接口、如何进行数据传递等。 总结来说,“Android Binder简单实例”涉及到Android系统中进程间通信的核心技术——Binder,...

    move android binder to linux

    分析这些文件可以帮助我们深入理解移植的具体实现细节,包括代码结构、接口设计以及优化策略。 总的来说,将Android Binder移植到Linux是一项复杂的工作,涉及到操作系统内核和用户空间的多个层面。但成功移植后,...

    Binder连接池Android

    在Android系统中,Binder是进程间通信(IPC,Inter-Process Communication)的主要机制,它使得应用程序之间能够共享数据和服务。...理解并正确运用Binder连接池,对于提升Android应用的性能和用户体验至关重要。

    Android直接通过binder节点通信

    这种方式需要对Binder协议有深入的理解,因为直接操作设备节点意味着需要手动构建和解析 Binder 消息,这通常比使用Android提供的AIDL(Android Interface Definition Language)接口更复杂。 在压缩包文件名"rpc_...

    binder原理

    ### Android Binder原理详解 #### 一、概述 Android Binder 是 Android 操作系统中核心的...在未来的学习和开发中,理解 Binder 的工作原理将有助于更好地利用这一强大的工具来构建高效的 Android 应用程序和服务。

    binder 核心思想分析

    通过对Binder驱动程序的深入分析,我们可以更好地理解Android系统底层的通信机制,这对于开发高性能、高可靠的Android应用具有重要意义。未来的研究可以进一步探索Binder机制在不同场景下的优化策略,以提升Android...

    Android的IPC机制-Binder

    3. **简洁性**:Binder的设计较为简单明了,易于理解和实现。 4. **统一性**:Binder机制不仅适用于C/C++环境,还适用于Java环境,使得整个Android平台的IPC机制更加统一和一致。 #### Binder机制的关键组成部分 -...

    IPC方式之Binder连接池

    本文将深入探讨"IPC方式之Binder连接池"这一主题,结合提供的DEMO实例,帮助你更好地理解和应用Binder连接池。 首先,我们要明白Binder是什么。Binder是Android系统中一种轻量级的进程间通信方式,它允许不同进程...

    Binder笔记

    Binder机制是Android系统的核心技术之一,深入理解和掌握Binder机制对于开发高性能的Android应用和服务是至关重要的。开发者可以通过阅读Android源码以及利用官方文档和社区资源来进一步了解和学习Binder机制的具体...

    android通信机制binder实例

    本篇将通过一个学习实例来深入理解Android Binder的工作原理及其应用。 一、Binder概述 Binder是Android操作系统中的一个核心组件,它为Android应用程序提供了安全、高效的进程间通信方式。与其他IPC机制相比,...

    Android binder_test

    通过`binder_test`这个示例,你可以深入理解Android系统的Binder机制,学习如何使用C++进行Binder编程,这对于开发涉及多进程通信的Android应用非常有帮助。实践中不断探索,将使你更加熟练掌握这一核心技术。

    Android Binder机制完全解析

    深入理解Binder机制对于Android应用开发尤其是系统级服务开发至关重要。 一、Binder基础概念 Binder是Android特有的一个轻量级的进程间通信机制,它允许不同进程间的对象互相调用方法,仿佛它们处于同一进程中。...

    binder例子

    【Binder详解:C++实现与服务通知】 ...在C++中实现Binder涉及到对Android Native API的理解和使用,以及对服务通知机制的掌握。通过分析和学习"Binder例子"这个项目,可以更好地掌握Binder在实际开发中的应用。

    C++binder通信实例

    首先,理解Binder机制的基本概念至关重要。Binder是Android操作系统提供的一种接口,通过它,应用程序可以跨进程调用服务,就像它们在同一进程中一样。Binder通信涉及到三个主要角色:客户端、服务端和Binder驱动。...

    Android利用Binder进行通信DEMO

    本示例"Android利用Binder进行通信DEMO"提供了一个简单的Binder通信流程,尽管代码质量可能不高,但基本思路清晰,有助于理解Binder的核心概念。 1. **Binder基础**:Binder是Android系统中的特殊对象,它可以跨...

Global site tag (gtag.js) - Google Analytics