- 浏览: 23743 次
- 性别:
- 来自: 北京
最新评论
page4
在这里我们分析一下ContextImpl的init函数的具体实现:
final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
}
1 final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
2 Resources container, String basePackageName, UserHandle user) {
3 mPackageInfo = packageInfo;
4 mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
5 mResources = mPackageInfo.getResources(mainThread);
6
7 if (mResources != null && container != null
8 && container.getCompatibilityInfo().applicationScale !=
9 mResources.getCompatibilityInfo().applicationScale) {
10 if (DEBUG) {
11 Log.d(TAG, "loaded context has different scaling. Using container's" +
12 " compatiblity info:" + container.getDisplayMetrics());
13 }
14 mResources = mainThread.getTopLevelResources(
15 mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
16 null, container.getCompatibilityInfo());
17 }
18 mMainThread = mainThread;
19 mActivityToken = activityToken;
20 mContentResolver = new ApplicationContentResolver(this, mainThread, user);
21 mUser = user;
22 }
init函数的主要逻辑就是初始化主要的成员变量
page5
activity的attach函数的定义如下, 注意下面是两个函数:
1 final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
2 Application application, Intent intent, ActivityInfo info, CharSequence title,
3 Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
4 Configuration config) {
5 attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
6 lastNonConfigurationInstances, config);
7 }
8
9 final void attach(Context context, ActivityThread aThread,
10 Instrumentation instr, IBinder token, int ident,
11 Application application, Intent intent, ActivityInfo info,
12 CharSequence title, Activity parent, String id,
13 NonConfigurationInstances lastNonConfigurationInstances,
14 Configuration config) {
15 attachBaseContext(context);
16
17 mFragments.attachActivity(this, mContainer, null);
18
19 mWindow = PolicyManager.makeNewWindow(this);
20 mWindow.setCallback(this);
21 mWindow.getLayoutInflater().setPrivateFactory(this);
22 if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
23 mWindow.setSoftInputMode(info.softInputMode);
24 }
25 if (info.uiOptions != 0) {
26 mWindow.setUiOptions(info.uiOptions);
27 }
28 mUiThread = Thread.currentThread();
29
30 mMainThread = aThread;
31 mInstrumentation = instr;
32 mToken = token;
33 mIdent = ident;
34 mApplication = application;
35 mIntent = intent;
36 mComponent = intent.getComponent();
37 mActivityInfo = info;
38 mTitle = title;
39 mParent = parent;
40 mEmbeddedID = id;
41 mLastNonConfigurationInstances = lastNonConfigurationInstances;
42
43 mWindow.setWindowManager(
44 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
45 mToken, mComponent.flattenToString(),
46 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
47 if (mParent != null) {
48 mWindow.setContainer(mParent.getWindow());
49 }
50 mWindowManager = mWindow.getWindowManager();
51 mCurrentConfig = config;
52 }
第15行(Activity->attach)调用attachBaseContext函数, 关于attachBaseContext函数的详细分析可以参考page6文件.
调用完attachBaseContext函数我们明白了, Activity拿着ContextImpl, 而ContextImpl也拿着这个Activity
page6
在这篇文章里, 我们分析一下Activity的attachBaseContext函数的具体逻辑, 其实attachBaseContext函数是从Activity的父类ContextThemeWrapper继承而来的,
我们先来看一下ContextThemeWrapper类的继承体系,
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context
那么ContextThemeWrapper的attachBaseContext函数的具体实现如下:
1 @Override protected void attachBaseContext(Context newBase) {
2 super.attachBaseContext(newBase);
3 mBase = newBase;
4 }
第2行(ContextThemeWrapper->attachBaseContext)调用父类ContextWrapper的attachBaseContext函数:
1 protected void attachBaseContext(Context base) {
2 if (mBase != null) {
3 throw new IllegalStateException("Base context already set");
4 }
5 mBase = base;
6 }
ContextWrapper的attachBaseContext函数会设置成员变量mBase, 使之指向一个Context对象, 也就是ContextImpl了.
ContextWrapper的成员变量mBase的定义如下:
Context mBase;
第3行(ContextThemeWrapper->attachBaseContext)又会初始化成员变量mBase, 我靠!咋又有一个!
ContextThemeWrapper的mBase的定义如下:
private Context mBase;
在这里我们分析一下ContextImpl的init函数的具体实现:
final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
}
1 final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
2 Resources container, String basePackageName, UserHandle user) {
3 mPackageInfo = packageInfo;
4 mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
5 mResources = mPackageInfo.getResources(mainThread);
6
7 if (mResources != null && container != null
8 && container.getCompatibilityInfo().applicationScale !=
9 mResources.getCompatibilityInfo().applicationScale) {
10 if (DEBUG) {
11 Log.d(TAG, "loaded context has different scaling. Using container's" +
12 " compatiblity info:" + container.getDisplayMetrics());
13 }
14 mResources = mainThread.getTopLevelResources(
15 mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
16 null, container.getCompatibilityInfo());
17 }
18 mMainThread = mainThread;
19 mActivityToken = activityToken;
20 mContentResolver = new ApplicationContentResolver(this, mainThread, user);
21 mUser = user;
22 }
init函数的主要逻辑就是初始化主要的成员变量
page5
activity的attach函数的定义如下, 注意下面是两个函数:
1 final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
2 Application application, Intent intent, ActivityInfo info, CharSequence title,
3 Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
4 Configuration config) {
5 attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
6 lastNonConfigurationInstances, config);
7 }
8
9 final void attach(Context context, ActivityThread aThread,
10 Instrumentation instr, IBinder token, int ident,
11 Application application, Intent intent, ActivityInfo info,
12 CharSequence title, Activity parent, String id,
13 NonConfigurationInstances lastNonConfigurationInstances,
14 Configuration config) {
15 attachBaseContext(context);
16
17 mFragments.attachActivity(this, mContainer, null);
18
19 mWindow = PolicyManager.makeNewWindow(this);
20 mWindow.setCallback(this);
21 mWindow.getLayoutInflater().setPrivateFactory(this);
22 if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
23 mWindow.setSoftInputMode(info.softInputMode);
24 }
25 if (info.uiOptions != 0) {
26 mWindow.setUiOptions(info.uiOptions);
27 }
28 mUiThread = Thread.currentThread();
29
30 mMainThread = aThread;
31 mInstrumentation = instr;
32 mToken = token;
33 mIdent = ident;
34 mApplication = application;
35 mIntent = intent;
36 mComponent = intent.getComponent();
37 mActivityInfo = info;
38 mTitle = title;
39 mParent = parent;
40 mEmbeddedID = id;
41 mLastNonConfigurationInstances = lastNonConfigurationInstances;
42
43 mWindow.setWindowManager(
44 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
45 mToken, mComponent.flattenToString(),
46 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
47 if (mParent != null) {
48 mWindow.setContainer(mParent.getWindow());
49 }
50 mWindowManager = mWindow.getWindowManager();
51 mCurrentConfig = config;
52 }
第15行(Activity->attach)调用attachBaseContext函数, 关于attachBaseContext函数的详细分析可以参考page6文件.
调用完attachBaseContext函数我们明白了, Activity拿着ContextImpl, 而ContextImpl也拿着这个Activity
page6
在这篇文章里, 我们分析一下Activity的attachBaseContext函数的具体逻辑, 其实attachBaseContext函数是从Activity的父类ContextThemeWrapper继承而来的,
我们先来看一下ContextThemeWrapper类的继承体系,
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context
那么ContextThemeWrapper的attachBaseContext函数的具体实现如下:
1 @Override protected void attachBaseContext(Context newBase) {
2 super.attachBaseContext(newBase);
3 mBase = newBase;
4 }
第2行(ContextThemeWrapper->attachBaseContext)调用父类ContextWrapper的attachBaseContext函数:
1 protected void attachBaseContext(Context base) {
2 if (mBase != null) {
3 throw new IllegalStateException("Base context already set");
4 }
5 mBase = base;
6 }
ContextWrapper的attachBaseContext函数会设置成员变量mBase, 使之指向一个Context对象, 也就是ContextImpl了.
ContextWrapper的成员变量mBase的定义如下:
Context mBase;
第3行(ContextThemeWrapper->attachBaseContext)又会初始化成员变量mBase, 我靠!咋又有一个!
ContextThemeWrapper的mBase的定义如下:
private Context mBase;
发表评论
-
Activity与WindowManagerService连接的过程(三)
2018-04-16 16:27 620page11 WindowManagerService ... -
Activity与WindowManagerService连接的过程(二)
2018-04-16 16:36 762page6 WindowManagerGlobal的getW ... -
Activity与WindowManagerService连接的过程(一)
2018-04-16 16:21 983page1 Activity组件在 ... -
Activity的ViewRoot的创建过程(三)
2017-11-06 14:25 737page7 在这篇文章里, 我们分析一下W类的构造过程. W ... -
Activity的ViewRoot的创建过程(二)
2017-11-06 14:29 935page4 我们看一下ViewRootImpl对象的创 ... -
Activity的ViewRoot的创建过程(一)
2017-11-06 14:27 1077page1 当一个Activity第一次激活的时候会为该Ac ... -
Activity的Window和WindowManager的创建过程(三)
2017-07-05 11:49 1332page9 在这里我们分析一下DisplayManager的 ... -
Activity的Window和WindowManager的创建过程(二)
2017-07-05 11:31 542page5 在这篇文章中, 我们分析一下ContextImp ... -
Activity的Window和WindowManager的创建过程(一)
2017-07-05 11:27 604page1 我们开始分析一下Activity的Window和 ... -
Acitivy创建Context的过程(一)
2017-06-21 14:15 634page1 从本篇文章开始,我们分析一下Activity创建 ... -
应用程序进程与SurfaceFlinger的连接过程
2017-06-21 11:49 1056我们从SurfaceComposerClient对象的创建开始 ... -
Android源码之SurfaceFlinger的启动(三)
2017-04-20 11:09 1041page11 我们来看一下SurfaceFlinger ... -
Android源码之SurfaceFlinger的启动(二)
2017-04-18 15:15 868page6 我们看一下Thread的run函数的实现: ... -
Android源码之SurfaceFlinger的启动(一)
2017-04-17 10:07 992page1 在Android系统中, 显示系统在底层是通过S ... -
Android源码之Zygote
2015-12-15 11:45 515当ActivityManagerService启动一个应用程序 ... -
Android源码之Binder(五)
2015-12-04 09:19 1507Service组件在启动时,需要将自己注册到Service M ... -
Android源码之Binder(四)
2015-12-04 09:18 1921case BINDER_SET_MAX_THREADS: ... -
Android源码之Binder(三)
2015-12-04 09:17 908{ int ret; struct binder_pr ... -
Android源码之Binder(二)
2015-12-04 09:15 546分析完Binder驱动程序的打开和内存分配的过程之后,我们看一 ... -
Android源码之Binder(一)
2015-12-04 09:12 993在Android系统中,进程间通信使用的是Binder机制。B ...
相关推荐
首先系统的服务会先检查startActivity中的intent的信息,然后在去创建进程,最后才是执行启动Acitivy的操作。而我们上面提到的显示白黑屏的问题,就是在这段时间内产生的。 系统在绘制页面加载布局之前,首先会初始...
在做Service简单练习时,在Service中的OnCreate、OnStart、OnDestroy三个方法中都像在Activity中同样的方法调用了Toast.makeText,并在Acitivy中通过两个按钮来调用该服务的onStart和onDestroy方法: DemoService...
我的第一个C#小程序之简单音乐播放器1731655933.html
练习springboot1 项目 模拟高并发秒杀,实现基本的登录、查看商品列表、秒杀、下单等功能,简单实现了系统缓存、降级和限流。SpringBoot + MyBatis + MySQL+Druid + Redis + RabbitMQ + Bootstrap + jQue….zip
html常规学习.zip资源资料用户手册
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
HTML转PDF py脚本
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
西电通院模电大作业课后题电路设计图24年
本文档主要讲述的是sqlserver内存释放;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
zw
发动机制造厂技术处安全、消防安全手册.docx
生产现场工艺文件执行检查管理流程说明.docx
Spring Boot集成Spring Security,HTTP请求授权配置:包含匿名访问、允许访问、禁止访问配置
通过设置截止频率和带宽来获取对应的滤波器参数
全国月尺度平均风速数据集(1961-2022, 0.25° × 0.25°)是一个高分辨率的网格化平均风速数据集,覆盖了中国大陆及周边地区。 该数据集通过科学方法整合气象观测和再分析数据,为气候研究、生态模型、农业生产、以及水资源管理等领域提供了重要支持。 数据下载后可显示详细信息。
styles
用VHDL语言设计电梯控制器.doc
管道试压报审验表、管道强度、严密性试验记录表.doc
使用springboot实现的旅游网站