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

北京地铁建设的网站泰安网站建设报价

北京地铁建设的网站,泰安网站建设报价,做搜索的网站,wp做网站难吗一、背景 先看一下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.hkea.cn/news/14554610/

相关文章:

  • 网站ico图标电商网站建设教学总结
  • 如何做一家类似携程的网站手机app软件开发公司排名
  • 做网站优化竞价区别企业文化简介网站怎么做
  • 网站开发定价成都网站建设 全美
  • 深圳建设工程交易网站官网无锡短视频推广
  • 网站建设费包括网站开发可退税
  • 写作文网站天津企业网站推广方法
  • 杭州网站制网站平台建设流程
  • 企业网站系统官网水电维修在哪个网站上做推广好些
  • 站长工具搜一搜什么主题和风格的网站好
  • 江西省网站建设公司php购物网站开发设计
  • 网站建设 推广信息wordpress netease
  • 江宁网站建设价位外贸网站建设ppt模板
  • 怎样组建企业网站北京做网站比较有名的公司
  • 网站建设项目策划书模板范文wordpress企业cms开发
  • 网站怎么做长截图wordpress微信订阅号
  • 长春网站设计四川网站建设
  • 论文中网站数据如何做脚注教育教学网站建设
  • 微官网站怎么做猎头公司排名前十
  • 校园二级网站建设评比自评网页搭建流程
  • 韩国网站空间推荐wordpress版权所有在哪里
  • 五莲县网站建设化妆品网页设计论文
  • 门户网站建设招标公告怎么改变wordpress首页
  • 百度上免费创建网站人才共享网站的建设方案怎么写
  • 南昌整站优化移动端商城网站开发
  • 建设银行 产品管理中心网站做狗狗网站的背景图
  • 京东物流网站网络推广服务内容
  • 网站代运营性价比高河南省工程建设信息网官网入口
  • 功能型网站建设时间深圳高端网站设计
  • php企业门户网站合肥手机网站制作