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

北京地铁建设的网站宿州哪家做网站好

北京地铁建设的网站,宿州哪家做网站好,wordpress评论头像添加alt,网站关键词选取的步骤和方法一、背景 先看一下Android系统架构图 在Android设备中#xff0c;设备先通电#xff08;PowerManager#xff09;#xff0c;然后加载内核层#xff0c;内核走完#xff0c;开始检查硬件#xff0c;以及为硬件提供的公开接口#xff0c;然后进入到库的加载。库挂载后开…一、背景 先看一下Android系统架构图 在Android设备中设备先通电PowerManager然后加载内核层内核走完开始检查硬件以及为硬件提供的公开接口然后进入到库的加载。库挂载后开始Init进程初始化调用init.rc。紧接着就是Android系统的核心模块Zygote进程的初始化这些开始走到了Framework层Zygote会fork各种进程AMSWMSHandler等并且AMS和WMS以及其他的service都会被SystemService存储起来通过SystemServiceManager来管理同样MainThread主进程也会在Zygote进程中创建。在创建各种service的时候同样也会这些服务提供了binder这样就可以和这些service进行通讯。 为什么要通过这张图来分析Andtroid系统那是因为我们熟悉了整个启动流程才会更好的使用这个框架简单、高效的完成组件加载。 二、常见的Application中加载机制 在正常开发过程中模块为了长期存活在应用中都会提前抢占application的入口。在application中比较常见的都是直接在oncreate方法中执行。因为APP启动是有AMS或者ATMS来完成application的创建(这就是为什么在上面介绍Android系统架构)。第一次启动正确的耗时应该从attachBaseContext()到第一个第一个Activity的onResume()的完成。这样加载机制运行在主线程中又会引起另外一个问题那就是卡顿和启动时间过长。 针对这个问题google提供了一个startup库实现一种在应用启动时初始化组件的简单而高效的方法。 三、StartUp组件 startup库实现一种在应用启动时初始化组件的简单而高效的方法。借助 App Startup 库可在应用启动时简单、高效地初始化组件。库开发者和应用开发者都可以使用 App Startup 来简化启动序列并显式设置初始化顺序。 依赖库 implementation androidx.startup:startup-runtime:1.1.1 代码库 核心的如上面包里的类所示。任何需要初始化的节点都需要实现Initializer的接口。 public interface InitializerT {/*** Initializes and a component given the application {link Context}** param context The application context.*/NonNullT create(NonNull Context context);/*** return A list of dependencies that this {link Initializer} depends on. This is* used to determine initialization order of {link Initializer}s.* br/* For e.g. if a {link Initializer} B defines another* {link Initializer} A as its dependency, then A gets initialized before B.*/NonNullListClass? extends Initializer? dependencies(); }oncreate初始化组件所需的所有操作并返回T的实例。dependencies依赖项如果当前的组件在初始化的时候依赖其他组件将其他初始化项添加进来即可。即需赖的Initializer初始化后才会创建自己案例 class MyInitializer(): InitializerBoolean {override fun create(context: Context): Boolean {Log.e(init,create-A)return true}override fun dependencies(): MutableListClassout Initializer* {Log.e(init,dependencies-A)return mutableListOf()} } 启动StartUp 启动startUp分为两种情况一种是自动还有一种是手动。 自动 providerandroid:nameandroidx.startup.InitializationProviderandroid:authorities${applicationId}.androidx-startupandroid:exportedfalsetools:nodemergemeta-dataandroid:namecom.example.wiik.testdemo.startup.MyInitializerandroid:valueandroidx.startup //provider provider添加startUp的provider。 meta-data就是我们初始化的对象类 执行如下 自动完成其实是调用了 AppInitializer.getInstance(context).discoverAndInitialize(); void discoverAndInitialize() {try {Trace.beginSection(SECTION_NAME);ComponentName provider new ComponentName(mContext.getPackageName(),InitializationProvider.class.getName());ProviderInfo providerInfo mContext.getPackageManager().getProviderInfo(provider, GET_META_DATA);Bundle metadata providerInfo.metaData;discoverAndInitialize(metadata);} catch (PackageManager.NameNotFoundException exception) {throw new StartupException(exception);} finally {Trace.endSection();}} 手动调用 手动调用也是需要注册provider新增meta-data元素但是手动调用需要新增一个节点 tools:noderemove 申请1在meta-data节点下申请那只有这一个meta-data的init对象是手动其他还是自动完成 申请2在provider节点下申请那provider节点下所有的节点都是需要时手动创建 providerandroid:nameandroidx.startup.InitializationProviderandroid:authorities${applicationId}.androidx-startupandroid:exportedfalsetools:nodemergemeta-dataandroid:namecom.example.wiik.testdemo.startup.MyInitializerandroid:valueandroidx.startup /meta-dataandroid:namecom.example.wiik.testdemo.startup.HandInitializerandroid:valueandroidx.startuptools:noderemove //provider 手动调用 boolean flag AppInitializer.getInstance(this).initializeComponent(HandInitializer.class); Log.e(init,hand return valueflag); 日志如下 1、 在启动过程中如果有自动和手动那么先启动自动再启动手动。 2、如果你的应用在init阶段有返回值那么自动初始化无法完成只有手动才能接收。 3、依赖dependencies 依赖是一种前置条件这种前置一般需要提前初始化如下。 先定义一个前置的Init对象 class ProposeInitializer(): InitializerBoolean {override fun create(context: Context): Boolean {Log.e(init,create-A-ProposeInitializer)WorkManager.initialize(context.applicationContext,Configuration.Builder().build());return true}override fun dependencies(): MutableListClassout Initializer* {Log.e(init,dependencies-C-ProposeInitializer)return mutableListOf()} } 引用前置Initer的类 class MyInitializer(): InitializerBoolean {override fun create(context: Context): Boolean {Log.e(init,create-A-AUTO)return true}override fun dependencies(): MutableListClassout Initializer* {return mutableListOf(ProposeInitializer::class.java)} } 分析 执行顺序A依赖了C先执行A的 依赖在执行C的依赖在执行C的创建在执行A的创建 这个时候即使C是手动模式也会变成自动。 如果C还依赖其他将会遍历其他的。 是否是自动始化isEagerlyInitialized 判断一个对象是否是自动 public boolean isEagerlyInitialized(NonNull Class? extends Initializer? component) {// If discoverAndInitialize() was never called, then nothing was eagerly initialized.return mDiscovered.contains(component);} 这个类的方法在provider会被提前执行。 四、总结 这样我们就完成了startUp的基本架构分析与使用如果你需要使用该框架可以将自己的类管里起来。    注意 如果发现启动失败看下前置条件是否满足
http://www.dnsts.com.cn/news/102808.html

相关文章:

  • 珠海网站建设企业音乐介绍网站怎么做
  • 闲鱼怎么做钓鱼网站个人做跨境电商哪个平台好
  • 北京网站备案拍照地点有没有学校需要建设网站
  • 背景 网站建设建立网站需要多少钱八寇湖南岚鸿团队
  • 河南企业网站优化wordpress sportsline
  • 中文响应式网站为什么石家庄突然封了
  • 网站高端设计设计感超强的公司名字
  • 山西做网站域名检测查询
  • 网站逻辑结构北京网站建设报价明细
  • 赣州销售网站网站要设置哪些栏目
  • 网站制作公司咨询网站制作公司wordpress persona
  • 做网站有什么js特效公司名字大全英文
  • 做外贸登录国外网站建设网站商城后台系统
  • 做网站买岩棉网站建设工作情况
  • 云南网站seo外包织梦网站怎么修改内容
  • 做详情页比较好的网站怎么找wordpress博客
  • 合肥做装修哪个网站好w3school
  • 长沙营销网站设计沈阳seo优化
  • 实验室网站制作软件开发技术培训课程
  • 龙江做网站网站建设 王卫洲
  • 网站项目建设合同龙华城市建设局网站
  • 一台vps主机可以建设多少个网站手机网站制作费用
  • 网站搭建功能需求wordpress密码登录插件
  • 电子元器件网站怎么做电脑系统做的好的网站
  • 做一个网站做少多少钱湖南省建设厅气源适配性目录2022
  • 用来做网站的软件上海网站建设电
  • 网站无障碍建设标准网站推荐货源
  • 微网站怎么注册wordpress插件h5
  • 企业网站建设存在的不足与困难文章wordpress
  • 网站地图如何更新给女朋友做情侣网站的程序员