Framework运行环境综述

1、android整体架构:

Android Framework启动过程(android内核剖析笔记)_第1张图片
Framework定义客户端和服务端的组件和接口:主要包括三个部分

1、 服务端 分别是WindowManagerService(Wms),ActivityManageService(Ams)其中Ams管理所有应用程序中的Activity
2、 客户端
ActivityThread类,Activity类,PhoneWindwo类,Window类,DecorView类,ViewRoot类等
3、Linux驱动


Android Framework启动过程(android内核剖析笔记)_第2张图片

2、Activity之间如何传递数据

所谓传递数据或者消息,一般指的是在多个线程之间,而Activity本身并不是线程。ActivityThread才是一个java类,它与线程之间没有关系,就好像我们定义一个苹果类,橘子类一样。

  • 方法1:可以先实例化某一个类,获得该类的引用,使用时通过引用去访问类的内部数据。
  • 方法2:对于A,B之间可以先实例化C,然后A,B把需要传递的数据存入到C,然后从C中取出。

Activity类的实例化是由Framework完成的,我们只使用startActivity方法告诉Framework去运行哪个Activity,这意味着我们得不到Activity的引用,那么就不能直接访问对象的内部数据。解决办法是使用
Activity,getApplication()方法,该方法返回一个Application对象,该Application对象在该程序中是唯一的,所有程序中的不同Activity返回的Application对象是相同的,对象的名称可以在AndroidMainfest_xml文件中指定,一旦获取到Application对象,就可以借助该对象在不同的Activity中传递数据。

除此之外,Framework本身也提供了标准的Activity之间传递数据的方法,Intent该类做为startactivity()中的一个参数。用于在启动Activity时传递给目标Activity。

3、一个Activity的启动过程(从linux内核到Framework层)

Android Framework启动过程(android内核剖析笔记)_第3张图片
1、最底层的是内核,内核将读取init.rc文件,并启动该文件中定义的各种服务。

2、系统中运行的第一个Dalvik虚拟机程序叫做zygote。英文是“卵”的意思,接下来所有的Dalvik虚拟机进程都是通过这个“卵”孵化出来的。

3、然后到Dalvik VM。当java程序运行时,都是由java虚拟机来解释java的字节码。它将这些字节码翻译成本地CPU的指令码。Dalvik VM其实和这一样。Dalvik VM的作用就 是创建一个虚拟机并执行参数中指定的java类。

4、SystemServer进程的启动。SystemServer是zygote启动的第一个进程。这个进程在Android的运行环境中扮演了“中枢神经”的作用。APK应用中能够直接交互的大部分系统服务都在该进程中运行。

5、启动各种系统服务和线程。SystemServer启动后,常见的像WindowManagerServer(Wms),ActivityManagerService(Ams),PackageManagerServer(Pms)等,这些系统服务都以一个线程的方式存在于SystemServer进程中。

6、启动第一个Activity。当以上线程都启动后,其实Asm将调用

mMainStack.resumeTopActivityLocked(null)

由于系统刚刚启动,mMainStack中没有任何Activity对象,因此调用
startHomeLocked()函数。从这样看来,开机后系统从哪个 Activity开始执行完全取决于mMainStack中的第一个Activity的对象。
在Ams的startHomeActivityLocked()中,系统发出一个catagory的字段CATEGORY_HOME的Intent

intent.setComponent(mTopComponent)if(mFactoryTest!=SystemServer.FACTORY_Test_LOW_LEVEL){      intent.addCategory(Intent.CATEGORY_HOME)}

无论哪个应用程序,只要声明自己能够响应的intent,那么就可以认为是Home程序。这是是android中为什么会存在各种所谓的“Home程序”的原因,系统并没有给任何程序赋予“Home”特权,而把这个特权交给用户。
这就是第一个Activity的启动过程。

更多相关文章

  1. android 延时 不用另起线程或timertask
  2. Google Android官方文档进程与线程(Processes and Threads)翻译
  3. Android-Jni线程(一)— 创建线程
  4. Android期末项目(一)—— 解析二维数组对象
  5. Android 线程池相关知识

随机推荐

  1. Android近场通信---NFC基础(五)
  2. Android(安卓)模拟器 GPU ON
  3. 关于使用 Android(安卓)MVVM + LiveData
  4. android lib 发布到jcenter
  5. layer-list 的用法
  6. Android(安卓)Studio开发——百度地图定
  7. 定制android启动界面
  8. Android电话Phone设计框架介绍
  9. fir.im Weekly - 如何进行 Android(安卓)
  10. android中读写文件