当前位置: 移动技术网 > 移动技术>移动开发>Android > 安卓应用有几个context

安卓应用有几个context

2020年08月14日  | 移动技术网移动技术  | 我要评论
最近看源码看到Context这一块,发现很多网上的博客对“安卓应用有几个context”这一个问题统一给出的答案是:Activity数量+Service数量+1我通过源码的分析发现根本不是这样,Context的数量应该是:2*(Activity数量+Service数量+1)要搞清楚这个问题就需要研究Activity和Application的生成了,Activity和Application的生成都位于ActivityThread的performLaunchActivity方法源代码:Contex

最近看源码看到Context这一块,发现很多网上的博客对“安卓应用有几个context”这一个问题统一给出的答案是:

Activity数量+Service数量+1

我通过源码的分析发现根本不是这样,Context的数量应该是:

2*(Activity数量+Service数量+1)

要搞清楚这个问题就需要研究Activity和Application的生成了,Activity和Application的生成都位于ActivityThread的performLaunchActivity方法源代码:

ContextImpl appContext = createBaseContextForActivity(r);
Activity activity = null;
// 1.为Activity生成context
ContextImpl appContext = createBaseContextForActivity(r);
 java.lang.ClassLoader cl = appContext.getClassLoader();
 //2.通过反射获取Activity实例
activity = mInstrumentation.newActivity(
       cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
 r.intent.setExtrasClassLoader(cl);
 r.intent.prepareToEnterProcess();
 ............
 //3.生成Application对象
 Application app = r.packageInfo.makeApplication(false, mInstrumentation);
 ...........
 appContext.setOuterContext(activity);
 activity.attach(appContext, this, getInstrumentation(), r.token,
     r.ident, app, r.intent, r.activityInfo, title, r.parent,
     r.embeddedID, r.lastNonConfigurationInstances, config,
     r.referrer, r.voiceInteractor, window, r.configCallback,
     r.assistToken);

注释1,会为Activity生成一个context,Activity本身是继承ContextWrapper的,ContextWrapper也是Context实例,但是ContextWrapper是不实现任何Context方法的,而是会通过一个代理去实现:

public ContextWrapper(Context base) {
        mBase = base;
    }

在安卓中,这个代理就是ContextImpl
所以每生成一个Activity就会有两个Context,生成Applicaiotn也是类似,也有两个Context,Service也是一样的。
最后在Activity中运行下面的代码,会知道各种Context实际是代表什么:

Log.d("TAGTAG",getApplicationContext()+"");  //获取Application的上下文,其实就是获取Application,这个方法是属于ContextWrapper
Log.d("TAGTAG",getApplication().getBaseContext()+""); //获取ContextWrapper的mBase
Log.d("TAGTAG",getBaseContext()+""); //获取当前Activity的ContextWrapper的mBase
Log.d("TAGTAG",this+""); //当前Activity
Log.d("TAGTAG",getApplication()+""); //获取Application

输出结果:

D/TAGTAG: android.app.Application@e5044c
D/TAGTAG: android.app.ContextImpl@79a2c95
D/TAGTAG: android.app.ContextImpl@67891aa
D/TAGTAG: com.example.test3.MainActivity@e1a206d
D/TAGTAG: android.app.Application@e5044c

本文地址:https://blog.csdn.net/whoami_I/article/details/107943161

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网