Activityd的初始化过程

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()等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值