注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

隐龙 为了一生的信念

今日默默沉于水,他日飞腾在九天...

 
 
 

日志

 
 

Activity的初始化过程  

2012-09-12 22:43:20|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Activityd的创建要经过一的初始化过程,我们平时在开发中只需要使用Intent就行了,至于如何让创建,以及如何加载apk里面的类资源以及文件资源都给屏蔽掉了,Intent到底是什么?为什么可以跨进程?为什么可以发广播又可以启动服务,还可以传参?Activity到底是什么,既可以显示空间又可以窗口管理,又可以路由消息?到底是什么机制在支撑着Activity运行?

这篇只简单的谈论下Activity的上下文创建过程。

Activity与ContextImpl的关联:

继承关系:
public class Activity extends ContextThemeWrapper
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context
class ContextImpl extends Context

Activity本身是一个Context类型的子类。
在ContextWrapper中间接实现了Context相关的方法,所以Activity也具有这些方法。
而在ContextWrapper中对Context相关的方法的实现实际上是调用mBase的相关方法的。
而这个mBase实际上就是ContextImpl的实例。
也就是说,所有Context子类型的对象调用Context相关方法时,实际上都是调用的ContextImpl实例的方法。

mBase的赋值是在ContextWrapper的以下方法中:
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }

而这个方法的调用是在Activity的以下方法中:
    final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            Object lastNonConfigurationInstance,
            HashMap<String,Object> lastNonConfigurationChildInstances,
            Configuration config) {
        attachBaseContext(context);

而这个方法的调用是在ActivityThread的以下方法中:
    private final Activity performLaunchActivity(ActivityRecord r, Intent customIntent)
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
                ContextImpl appContext = new ContextImpl();
                appContext.init(r.packageInfo, r.token, this);
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstance,
                        r.lastNonConfigurationChildInstances, config);
                mInstrumentation.callActivityOnCreate(activity, r.state);

这个方法是在luncher一个Activity时调用的。
通过方法可以看出,系统首先创建一个Activity对象,然后构造相关的Application对象。
之后,创建ContextImpl对象,并调用init方法初始化相关成员,之后将其添加给Activity对象。
这样,Activity就和ContextImpl对象关联上了。
在之后会调用Activity相关的回调函数,比如onCreate()等。

  评论这张
 
阅读(713)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018