安卓context(一)
最近看了一下深入安卓内核,毫无安卓基础的我一头深入不可自拔,看的是云里雾里,第一遍看到一半左右似乎开始失去了效率。
现在开始第二遍,并对看过的重要知识点以个人的理解进行梳理(不免有错的地方,好心人请告知,我也会经常反复阅读与更新)
其实我个人理解的话,context是一个页面或者说是一个场景。
我想刚开始我们可以从UML图挖掘我们一些基础知识。
1 可以看出我们常用的activity和service都是继承或者间接继承的是ContextWrap类。
2 有所不同的是activity是通过contextThemeWrapper来的,其实也很好理解,因为activity是有页面的所以他需要一个主题。
Context类本身是一个纯abstract类,那ContextWrap是什么呢?从他的构造函数可以看出他是context的一个包装
public class ContextWrapper extends Context {
Context mBase; public ContextWrapper(Context base) {
mBase = base;
}
OK,一下子右边半边的类图我们已经清楚了。
接下来我们看左边的ContextImpl他往下没有子类,而从这个名字来看他应该是真正实现了context的所有抽象方法。
那么我们找一下再哪里有被调用?
我们发现代码在ActivityThread中的handleBindApplication()方法中,此方法内部调用了makeApplication方法里面恰好有new contextImpl()
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
String appClass = mApplicationInfo.className;
java.lang.ClassLoader cl = getClassLoader();
ContextImpl appContext = new ContextImpl(); //创建contextImpl对象
appContext.init(this, null, mActivityThread); //进行初始化赋值,请注意第一个参数this是值得mPackageInfo对象
application app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
appContext.setOuterContext(app);
}
...
}
可见在创建context的时候会用到contextImpl类。
那么我们接下来看一下application、service、activity的创建过程我这边分别用/隔开,其实原理都是一样的。
1 AMS创建ApplicationInfo/Servicelnfo/Activitylnfo对象
2 AMS通过IPC调用的activeThread对象的bindApplication/scheduleCreateService/scheduleLaunchActivity方法将ApplicationInfo/Servicelnfo/Activitylnfo传入。
3 bindApplication/scheduleCreateService/scheduleLaunchActivity方法会将ApplicationInfo/Servicelnfo/Activitylnfo的值赋值给AppBindData/CreateServiceData/ActivityRecord
4 调用handleBindApplication/handleCreateService/handleLaunchActivity方法中的getPackageInfoNoChecked()方法为AppBindData/CreateServiceData/ActivityRecord的Info属性赋值PackageInfo
5 调用make方法创建对应的context
以上5个步骤分别是创建activity,application,service对象,注意packageInfo是一个全局的对象。context和package是多对一的关系
1 说简单点其实就是AMS需要把INFO信息传递给ActivityThread
2 activityThread将传入的Info信息包装一下成为自己的数据结构DATA
3 然后再去获取全局的PackageInfo对象装载到自己的DATA里
4 调用makeXXX进行创建
context的个数=service+activity+application(1个)
安卓context(一)的更多相关文章
- 安卓 Context 和 Application的关系
1. 我开始一直不理解显式Intent中传一个this(当前的activity)是为什么.因为Intent里面的构造方法对应的只有 Context, Class.后面查资料才发现 Intent i = ...
- Android的Context && 安卓常用系统服务(当前运行包名/当前网络状态和开关网络/音频服务/马达服务) (转)
转:http://blog.csdn.net/zhandoushi1982/article/details/8501773 Context字面意思上下文,位于framework 的android.co ...
- 安卓自定义组合控件--toolbar
最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...
- 放弃安卓原生TimePicker,选择wheelView打造更漂亮的时间get,以及动态拉伸输入框布局,这些,这里都有!
最近公司要求的上线项目有这么一个需求,要写一个请假申请的页面,里面必须有请假开始时间,结束时间,还有一个请假原因. 于是想到时间选择嘛,官方不是有个DatePicker吗?额,是不是要DatePick ...
- android使用ImageLoader实现图片缓存(安卓开发必备)
相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...
- 安卓第一次启动引导页使用ViewPager实现
我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等.一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单 ...
- 安卓开发之ListAdapter(二)
今天我们来学习一下ArrayAdapter: ArrayAdapter是安卓中最简单的适配器.使用ArrayAdapter(数组适配器),需要把数据源存 放至数组里面来显示. •构造函数: publi ...
- android安卓Sqlite数据库实现用户登录注册
看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...
- 安卓中AIDL的使用方法快速入门
1.AIDL是什么? AIDL全称是Android Interface Definition Language,即安卓接口定义语言. 2.AIDL是用来做什么的?(为什么要有AIDL) AIDL是用来 ...
随机推荐
- c#右键窗体弹出菜单
在工具箱(快捷键ctrl+w+x)——菜单和工具栏中找到 在属性中用这个绑定 然后写后台代码
- word中磅和mm的换算
字号 磅 毫米数 初号 42 14.82 小初 36 12.70 一号 26 9.17 小一 24 8.47 二号 22 7.76 小二 18 6.35 三号 16 5.64 小三 15 5.29 四 ...
- iOS之旅--隐藏(去除)导航栏底部横线
iOS之旅--隐藏(去除)导航栏底部横线 iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分 ...
- JAVA文件操作工具类(读、增、删除、复制)
使用JAVA的JFinal框架 1.上传文件模型类UploadFile /** * Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com). * ...
- 【PE】手动给PE文件添加一段代码MessageBoxA
源程序是这个样子: 思路: 1.通过LordPE工具拿到所需数据 2.OllyDebug通过BP MessageBoxA拿到MessageBoxA地址 3.UE十六进制编辑器定位代码节基址 4.在代码 ...
- linux下csv导出文件中文乱码问题
近日在服务器端通过导出csv文件,将数据从linux服务器端保存到windows桌面端,以便用户可以通过excel打开使用数据. 但是在使用excel打开csv文件时,出现了中文乱码的情况,但是使用记 ...
- Struts2之类范围拦截器和方法拦截器
1.Struts2拦截器的体系结构 Struts2拦截器最大的特点是其透明性,即用户感觉不到它的存在,但我们在使用Struts2框架时,拦截器时时刻刻都在帮助我们处理很多事情. 包括: 文件上传 表单 ...
- php 人人商城 生成 临时微信二维码,并保存成海报图片 有效期一个月
public function getPoster(){ global $_W; global $_GPC; $mm = pdo_fetch('select nickname,codetime fro ...
- Scala构建元数据
反射方式构建元数据: 通过反射来获取RDD中的Schema信息.这种方式适合于列名(元数据)已知的情况下 步骤: 1.SparkConf配置环境 2.SparkContext初始化上下文 3.SQLC ...
- C语言字符篇(一)字符串转换函数
#include <stdlib.h> double atof(const char *nptr); 将字符串转换成双精度浮点数 int atoi(const char *npt ...