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

wordpress子目录 多站点橙色系网站

wordpress子目录 多站点,橙色系网站,淘宝做关键词的网站,郑州代理记账一.简介Context 翻译为上下文环境#xff0c;是一个应用程序环境信息的接口。如果以 Android 系统角度来看可以理解为某一与操作系统的交互的具体场景#xff0c;比如 Activity 的具体功能#xff0c;Service 的后台运行等。如果以程序的角度看#xff0c;Context 是一个抽…一.简介Context 翻译为上下文环境是一个应用程序环境信息的接口。如果以 Android 系统角度来看可以理解为某一与操作系统的交互的具体场景比如 Activity 的具体功能Service 的后台运行等。如果以程序的角度看Context 是一个抽象类维持 Android 程序中各组件能够正常工作的一个核心功能类。通过 Context 可以获取应用程序的资源和类也可以进行一些应用程序的操作。Context 的设计采用了代理模式它的功能的具体实现类是 ContextImpl 而间接的实现类是 Activity Service 和 Application。因此一个应用程序 Context 的实例的对象的个数就是 Activity Service 和一个 Application 这三者的总数。它们的具体关系如图: 可以看到在代理模式中 ContextWrapper 的变量 mBase 是一个 ContextImpl 类型通常Activity Service 和 Application 中的操作最终都会通过 mBase 交给 ContextImpl 去实现最后在通过 mOuterContext 对结果进行放回显然这个变量实际上就是Context 的三个具体的实现。下面就看这三种 Context 是如何创建并与 ContextImpl 关联的。二.创建 Context1.Application Context一个应用程序启动时候总是会创建 Application具体是由 LoadedApk 实现。Application app r.loadedApk.makeApplication(false, mInstrumentation);// LoadedApk 中public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) {...Application app null;...ContextImpl appContext ContextImpl.createAppContext(mActivityThread, this);app mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);appContext.setOuterContext(app);在这里可以看到一个大致的框架这里可以分为三个步骤去看; - 首先会去创建 Application 的 ContextImpl - 然后把这个 ContextImpl 作为一个参数传到 newApplcation 方法中去创建 Application - 最后将 ContextImpl 和 Application 关联。第一步想看 ContextImpl 的静态方法 createAppContextstatic ContextImpl createAppContext(ActivityThread mainThread, LoadedApk loadedApk) {...ContextImpl context new ContextImpl(null, mainThread, loadedApk, null, null, null, 0,null);context.setResources(loadedApk.getResources());return context;}很明显就是创建 ContextImp,并设置应用的资源。接着看第二步创建 Application。//在 Instrumentation 类中static public Application newApplication(Class? clazz, Context context)...Application app (Application)clazz.newInstance();app.attach(context);//这里的Context 就是ContextImpl return app;}// 在 Application 中/* package */ final void attach(Context context) {attachBaseContext(context);mLoadedApk ContextImpl.getImpl(context).mLoadedApk;}// 在 ContextWrapper 类中protected void attachBaseContext(Context base) {if (mBase ! null) {throw new IllegalStateException(Base context already set);}mBase base;}可以看到首先就是通过类加载去创建 Application然后就将 ContextImpl 赋值给 mBase 这样 Application 和 ContextImpl 的关联就建立。 最后看第三步。appContext.setOuterContext(app);//在 ContextImpl 中 final void setOuterContext(Context context) {mOuterContext context;}将返回的 Application 赋值给 ContextImpl 的变量 mOuterContext这样 Context 的代理模式完成关联Application Context 也创建完毕。流程如图 2.Activity ContextActivity Context 的创建可以定位到 Activity 启动过程在 ActivityThread 中。private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {...ContextImpl appContext ContextImpl 作为参数 关联ContextImpl(r);Activity activity null;try {java.lang.ClassLoader cl appContext.getClassLoader();activity mInstrumentation.newActivity(cl, component.getClassName(), r.intent);StrictMode.incrementExpectedActivityCount(activity.getClass());...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);}整个过程和 Application 比较相似不过有一点不同这里分为 4 步来看: - 创建 ContextImpl 对象 - 创建 Activity 实例 - ContextImpl 关联 Activity - Activity 关联 ContextImpl先看第一步过程private ContextImpl createBaseContextForActivity(ActivityClientRecord r) {...ContextImpl appContext ContextImpl.createActivityContext(this, r.loadedApk, r.activityInfo, r.token, displayId, r.overrideConfig);...static ContextImpl createActivityContext(ActivityThread mainThread,...ContextImpl context new ContextImpl(null, mainThread, loadedApk, activityInfo.splitName,activityToken, null, 0, classLoader);...与 application 不同的是这里创建的是对应的 Activity 的 ContextImpl 具有不一样的功能实现。接着实例化 Activitypublic Activity newActivity(ClassLoader cl, String className,Intent intent)throws InstantiationException, IllegalAccessException,ClassNotFoundException {return (Activity)cl.loadClass(className).newInstance();}同样也是通过类加载创建 Activity。在第三四步中//第三步在ContextImpl 中final void setOuterContext(Context context) {mOuterContext context;}//第四步在 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,NonConfigurationInstances lastNonConfigurationInstances,Configuration config, String referrer, IVoiceInteractor voiceInteractor,Window window, ActivityConfigCallback activityConfigCallback) {...attachBaseContext(context);... }Overrideprotected void attachBaseContext(Context newBase) {super.attachBaseContext(newBase);...}//在 ContextWrapper 中protected void attachBaseContext(Context base) {if (mBase ! null) {throw new IllegalStateException(Base context already set);}mBase base;}通过 ContextImpl 和 Activity 的相互关联Activity Context 的创建也就完成了以后 Activity 的任务大多就是通过 ContextImpl 实现。流程如图 3.Service ContextService 的Context 的创建和 Activity 的十分相似.private void handleCreateService(CreateServiceData data) {LoadedApk loadedApk getLoadedApkNoCheck(data.info.applicationInfo, data.compatInfo);Service service null;try {java.lang.ClassLoader cl loadedApk.getClassLoader();service (Service) cl.loadClass(data.info.name).newInstance();} catch (Exception e) {...}ContextImpl context ContextImpl.createAppContext(this, loadedApk);context.setOuterContext(service);...service.attach(context, this, data.info.name, data.token, app,ActivityManager.getService());整个流程没有大的变化只是 Service 会先实例在去创建 ContextImpl 而且这里的 ContextImpl 和 Activity 是不一样的。流程如图 三.Context 的使用前面说过 Context 的实现就是 Activity Service 和 Application ,因此如果对 Context 使用不当的话很容易发生内存泄漏比如下面这两段代码public class A {private static Context mContext;public static void setContext(Context context){mContext context;} } public class B {private static B sInstance;private Context mContext;private B(Context context){this.mContext context;}public static synchronized B getInstance(Context context){if (sInstance null){sInstance new B(context);}return sInstance;}}在第一段代码中有一个静态的 Context ,在第二段是一个单例模式一个静态实例拥有一个 Context 变量。在这两种情况下Context 的周期就和应用程序一样这是如果赋值时 Activity 或者 Service 就会使得 Activity 和 Service 在退出后不能正常被回收因为还有 Context 引用。因此建议尽量 Application Context 因为 Application Context 的周期就是整个应用程序所以不用担心内存泄漏。但是在某些情况比如创建 Dialog, 或者启动组建的时候就只能使用 Activity Context 或者 Service Context ,这个时候就要注意内存泄漏问题了。
http://www.zqtcl.cn/news/437122/

相关文章:

  • 基于php的网站开发流程图如何建设一个公众号电影网站
  • 2018年怎么做网站排名如何提升网站的收录量
  • 租电信服务器开网站为何要屏蔽网站快照
  • 广州建设网站技术企业咨询属于什么行业
  • 哪些网站容易做网站开发价格
  • 展览网站源码棋牌游戏软件开发
  • 网站开发业务ppt做网站如何放入图像
  • 专业做网站和小程序车载网络设计是干什么的
  • 运城网站建设兼职建设通网站武义巨合汪志刚
  • 广州网站建设公司排行个人介绍网页设计模板图片
  • 东莞营销网站建设多少钱wordpress开场动画
  • 网站建设问题及解决办法网站优化过度的表现
  • html5手机网站教程合肥企业网站营销电话
  • 公司网站引导页建设银行网站怎么登录密码忘了怎么办
  • iis7 网站打不开做兼职哪个网站好
  • 惠州网站制作网站iot物联网平台开发
  • 龙岩门户网站最新仿58同城网站源码
  • 简单的企业小网站南宁最新消息今天
  • 美橙表业手表网站公司推广渠道
  • 大连网站排名优化价格wordpress锚文字
  • 漯河网做网站南京市建设工程档案馆网站
  • 重庆可以建建网站的平台天眼查 企业查询官网
  • gta5单机买房子网站在建设免费建小程序网站
  • 怎么制作网站设计图片劳动保障局瓯海劳务市场和做网站
  • 视屏网站制作青岛平台网站建设
  • asp网站做搜索义乌网站建设工作室
  • .net网站开发环境wordpress添加特效
  • 常州 网站制作如何找专业的网站建设公司
  • 陕西网络营销优化公司seo搜索价格
  • 山东通信局报备网站东营城镇建设规划网站