当前位置: 首页 > news >正文

开锁在百度上做网站要钱吗wordpress wdlog主题

开锁在百度上做网站要钱吗,wordpress wdlog主题,徐州泉山区建设局网站,免费推广平台前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论#xff0c;读者对于context在心中有了一定的理解。但始终觉得少点什么#xff1a;activity是什么时候被创建的读者对于context在心中有了一定的理解。但始终觉得少点什么activity是什么时候被创建的他的contextImpl是如何被赋值的Application呢为什么说ContextProvider的context是ApplicationBroadcast的context是ActivitycontextImpl又是如何被创建的解决这些疑惑就必须阅读源码了。 Application Application应用级别的context是在应用被创建的时候被创建的是第一个被创建的context也是最后一个被销毁的context。因而追踪Application的创建需要从应用程序的启动流程看起。应用启动的源码流程如下简化版 应用程序从ActivityThread的main方法开始执行从全面认识Handler消息机制中我们知道main方法主要是开启线程的Looper以及handler然后由AMS向主线程发送message控制应用的启动过程。因而我们可以把目标锁定在图中的最后一个方法handleBindApplicationApplication最有可能在这里被创建 ActivityThread.class (api29)private void handleBindApplication(AppBindData data) {...// 创建LoadedApk对象data.info getPackageInfoNoCheck(data.appInfo, data.compatInfo);...Application app;...try {// 创建Applicationapp data.info.makeApplication(data.restrictedBackupMode, null);...}try {...// 回调Application的onCreate方法mInstrumentation.callApplicationOnCreate(app);}... } handleBindApplication的参数AppBindData是AMS给应用程序的启动信息其中就包含了“权限凭证”——ApplicationInfo等。LoadedApk就是通过这些对象来创建获取对系统资源的访问权限然后通过LoadApk来创建ContextImpl以及Application。 这里我们只关注和context创建有关的逻辑前面启动程序的源码以及AMS如何处理这里就不讲了读者有兴趣可以读ContextProvider启动流程这篇文章其中对ContextProvider的启动过程就有对上述源码进行追踪详解。 那么接下来我们继续关注Application是如何创建的 LoadeApk.class(api29) public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) {// 如果application已经存在则直接返回if (mApplication ! null) {return mApplication;}...Application app null;String appClass mApplicationInfo.className;...try {java.lang.ClassLoader cl getClassLoader();...// 创建ContextImplContextImpl appContext ContextImpl.createAppContext(mActivityThread, this);// 利用类加载器加载我们在AndroidMenifest指定的Application类app mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);// 把Application的引用给comtextImpl这样contextImpl也可以很方便地访问ApplicationappContext.setOuterContext(app);} ...mActivityThread.mAllApplications.add(app);// 把app设置为mApplication当我们调用context.getApplicationContext就是获取这个对象mApplication app;if (instrumentation ! null) {try {// 回调Application的onCreate方法instrumentation.callApplicationOnCreate(app);} ...}...return app; }代码的逻辑也不复杂首先判断LoadedApk对象中的mApplication是否存在否则创建ContextImpl再利用类加载器和contextImpl创建Application最后把Application对象赋值给LoadedApk的mApplication再回调Application的onCreate方法。我们先来看一下contextImpl是如何创建的 ContextImpl.class(api29) static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo,String opPackageName) {if (packageInfo null) throw new IllegalArgumentException(packageInfo);ContextImpl context new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,null, opPackageName);context.setResources(packageInfo.getResources());return context; } 这里直接new了一个ContextImpl同时给ContextImpl赋值访问系统资源相关的“权限”对象——ActivityThreadLoadedApk等。让我们再回到Application的创建过程。我们可以猜测在newApplication包含的逻辑肯定有利用反射创建Application再把contextImpl赋值给Application。原因是每个人自定义的Application类不同需要利用反射来创建对象其次Application中的mBase属性是对ContextImpl的引用。看源码 Instrumentation.class(api29) public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {Application app getFactory(context.getPackageName()).instantiateApplication(cl, className);app.attach(context);return app; }Application.class(api29) final void attach(Context context) {attachBaseContext(context);mLoadedApk ContextImpl.getImpl(context).mPackageInfo; }ContextWrapper.class(api29) Context mBase; protected void attachBaseContext(Context base) {if (mBase ! null) {throw new IllegalStateException(Base context already set);}mBase base; } 结果非常符合我们的猜测先创建Application对象再把ContextImpl通过Application的attach方法赋值给Application。然后Application的attach方法调用了ContextWrapper的attachBaseContext方法因为Application也是继承自ContextWrapper。这样就把ContextImpl赋值给Application的mBase属性了。 再回到前面的逻辑创建了Application之后需要回调onCreate方法 Instrumentation.class(api29) public void callApplicationOnCreate(Application app) {app.onCreate(); } 简单粗暴直接回调。到这里Application的创建以及context的创建流程就走完了。但是需要注意的是全局初始化需要在onCreate中进行而不要在Application的构造器中执行。从代码中我们可以看到ContextImpl是在Application被创建之后再赋值的。 Activity Activity的context也是在Activity创建的过程中被创建的这个就涉及到Activity的启动流程这里涉及到三个流程应用程序请求AMSAMS处理请求应用程序响应Activity创建事务 依然我们专注于Activity的创建流程其他的读者可阅读Activity启动流程这篇文章了解。和Application一样Activity的创建时由AMS来控制的AMS向应用程序进程发送消息来执行具体的启动逻辑。最后会执行到handleLaunchActivity这个方法 ActivityThread.class(api29) public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent) { ... final Activity a performLaunchActivity(r, customIntent); ... return a; } 最终的就是中间这句代码进入看源码 ActivityThread.class(api29) private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {...// 创建Activity的ContextImplContextImpl appContext createBaseContextForActivity(r);Activity activity null;try {// 利用类加载创建activity实例java.lang.ClassLoader cl appContext.getClassLoader();activity mInstrumentation.newActivity(cl, component.getClassName(), r.intent);...}try {// 创建ApplicationApplication app r.packageInfo.makeApplication(false, mInstrumentation);...if (activity ! null) {...// 把activity设置给context这样context也可以访问到activity了appContext.setOuterContext(activity);// 调用activity的attach方法把contextImpl设置给activityactivity.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);int theme r.activityInfo.getThemeResource();if (theme ! 0) {// 设置主题activity.setTheme(theme);}...// 回调onCreate方法if (r.isPersistable()) {mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);} else {mInstrumentation.callActivityOnCreate(activity, r.state);}...}...}...return activity; }代码的逻辑不是很复杂首先创建Activity的ContextImpl利用类加载创建activity实例然后再通过LoadedApk创建Application这个方法在前面我们讲过如果Application已经创建会直接返回已经创建的对象。然后把activity设置给context这样context也可以访问到activity了。这里要注意前面讲到使用Activity的context会造成内存泄露那么可不可以用Activity的contextImpl对象呢答案是不可以因为ContextImpl也会持有Activity的引用需要特别注意一下。随后再调用activity的attach方法把contextImpl设置给activity。后面是设置主题和回调onCreate方法我们就不深入了主要看看attach方法 Activity.class(api29) final void attach(Context context,...) {attachBaseContext(context);... } 这里省略了大量的代码只保留关键一句attachBaseContext是不是很熟悉调用ContextWrapper的方法来给mBase属性赋值和前面Application是一样的就不再赘述。 Service 依然只关注关键代码流程先看Service的启动流程图 Service的创建过程也是受AMS的控制同样我们看到创建Service的那一步最终会调用到handleCreateService这个方法 private void handleCreateService(CreateServiceData data) {...LoadedApk packageInfo getPackageInfoNoCheck(data.info.applicationInfo, data.compatInfo);Service service null;try {java.lang.ClassLoader cl packageInfo.getClassLoader();service packageInfo.getAppFactory().instantiateService(cl, data.info.name, data.intent);} ...try {...ContextImpl context ContextImpl.createAppContext(this, packageInfo);context.setOuterContext(service);Application app packageInfo.makeApplication(false, mInstrumentation);service.attach(context, this, data.info.name, data.token, app,ActivityManager.getService());service.onCreate();mServices.put(data.token, service);...} ... }Service的逻辑就相对简单了同样创建service实例再创建contextImpl最后把contextImpl通过Service的attach方法赋值给mBase属性最后回调Service的onCreate方法。过程和上面的很像这里就不再深入讲了感兴趣的读者可自行去阅读源码也可以阅读Android中Service的启动与绑定过程详解基于api29这篇文章了解Service的详细内容。 小结 文章讲解了三大context实现类的启动流程相信通过源码阅读对context有一个更加彻底的理解。四大组件还有广播以及内容提供器限于篇幅就放在下一部分讲了。
http://www.dnsts.com.cn/news/88333.html

相关文章:

  • 吴江网站建设收费做网站选择系统
  • 地方网站 o2o娄底网站建设企业
  • wordpress后台左上角盐城seo 优化
  • 网站推广专业外贸建站seo
  • 网站跳转是什么意思途牛企业网站建设方案
  • 谷歌seo收费十堰seo按天计费
  • 企业网站设计哪个好网站优化 福州
  • 买的网站模板会影响提高网站建设水平意见方案
  • 爱站网 关键词挖掘工具站中山市网站开发
  • 网站的动画广告横幅怎么做的软件技术开发合同
  • 大连网站运营wordpress评论框高度
  • 医院建设网站意义公司网页设计费计入什么科目
  • 公司网站建设合同交印花税吗宁波网站建设计
  • 运城建设局网站网页界面设计一般使用的分辨率
  • 网站建设788gg中国免费网站服务器下载
  • 网站建设后期修改江苏省交通工程建设局网站
  • 哪个网站可以做英文兼职为网站做电影花絮
  • 钓鱼网站制作利鑫做彩票网站
  • 做外贸的物流网站有哪些如何创办一个赚钱的网站
  • 湛江建设局网站如何购买大量客户电话号码
  • 做色流网站服务器项目总结
  • 永久免费网站建设方案书签制作过程
  • 个人建设网站服务器怎么解决方案seo费用价格
  • 本溪做网站手机app应用制作
  • 开发网站类型申报城市维护建设税上哪个网站
  • 温州专业全网推广建站公司亚马逊网络营销方式
  • 网站建设字图东莞英文网站制作
  • 济南市做网站公司社区电商网站设计
  • ps专门做兼职的网站深圳百度推广代理
  • 微网站后台录入2023网页游戏排行榜