安卓c语言获取context,Android中Context详解 ---- 你所不知道的Context

二、 什么时候创建Context实例

熟悉了Context的继承关系后,我们接下来分析应用程序在什么情况需要创建Context对象的?应用程序创建Context实例的

情况有如下几种情况:

1、创建Application 对象时, 而且整个App共一个Application对象

2、创建Service对象时

3、创建Activity对象时

因此应用程序App共有的Context数目公式为:

总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)

具体创建Context的时机

1、创建Application对象的时机

每个应用程序在第一次启动时,都会首先创建Application对象。如果对应用程序启动一个Activity(startActivity)流程比较

清楚的话,创建Application的时机在创建handleBindApplication()方法中,该函数位于 ActivityThread.java类中 ,如下:

//创建Application时同时创建的ContextIml实例

privatefinalvoidhandleBindApplication(AppBindData data){

...

///创建Application对象

Application app = data.info.makeApplication(data.restrictedBackupMode,null);

...

}

publicApplication makeApplication(booleanforceDefaultAppClass, Instrumentation instrumentation) {

...

try{

java.lang.ClassLoader cl = getClassLoader();

ContextImpl appContext =newContextImpl();//创建一个ContextImpl对象实例

appContext.init(this,null, mActivityThread);//初始化该ContextIml实例的相关属性

///新建一个Application对象

app = mActivityThread.mInstrumentation.newApplication(

cl, appClass, appContext);

appContext.setOuterContext(app);//将该Application实例传递给该ContextImpl实例

}

...

}

2、创建Activity对象的时机

通过startActivity()或startActivityForResult()请求启动一个Activity时,如果系统检测需要新建一个Activity对象时,就会

回调handleLaunchActivity()方法,该方法继而调用performLaunchActivity()方法,去创建一个Activity实例,并且回调

onCreate(),onStart()方法等, 函数都位于 ActivityThread.java类 ,如下:

//创建一个Activity实例时同时创建ContextIml实例

privatefinalvoidhandleLaunchActivity(ActivityRecord r, Intent customIntent) {

...

Activity a = performLaunchActivity(r, customIntent);//启动一个Activity

}

privatefinalActivity performLaunchActivity(ActivityRecord r, Intent customIntent) {

...

Activity activity =null;

try{

//创建一个Activity对象实例

java.lang.ClassLoader cl = r.packageInfo.getClassLoader();

activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

}

if(activity !=null) {

ContextImpl appContext =newContextImpl();//创建一个Activity实例

appContext.init(r.packageInfo, r.token,this);//初始化该ContextIml实例的相关属性

appContext.setOuterContext(activity);//将该Activity信息传递给该ContextImpl实例

...

}

...

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值