从Google的官方应用程序启动文档中:应用程序启动库在应用程序启动时提供了一种简单有效的初始化组件的方法。Libary开发人员和应用程序开发人员都可以使用应用程序启动来简化启动顺序并清楚地设置初始化的顺序。
内容提供商的内容有多种类型的内容:您可以通信 - 过程中的过程(数据共享),contentResolver#register -contentobserver观察到的URI更改(可以处理各种订单)等。ContentProvider通过Binder实现Inter -Process Communication,比AIDL更简单,因为这比AIDL更简单,因为艾滋病的系统帮助我们封装了()
我们需要在AndroidManifest.xml中注册我们的ContentProvider
上面有两个属性。让我们看一下它是什么?
我们开始从ActivityThread的主要功能进行跟踪:
让我们看一下ActivityThread的附件方法
打开activityManagerService视图方法将在
在这里看到我们发现ActivityThread中的bindapplication:
看到这一点,似乎目前看到光线,bind_application此消息将在内部执行
安装ContentProvider步骤如下:(1)。遍历提供商列表,执行安装程序以实例化contentProvider(2)。AMS呼吁PublishContentProders的新闻删除随着时间的流逝,否则将导致kill使用该应用程序。
安装程序步骤如下:(1)。获取上下文(2)。通过PeekPackageInfo获取LoadedApk,然后实例化的ContentProvider(3)。ContentProvider由Class Loader实例化。
从上面的代码分析中可以得出结论,contentprovider的创建将执行
如果我们的内容提供商中的数据可以使用应用程序上下文中的ContentResolver对象与ContentProvider.ContentProvider对象接收数据请求,执行请求操作并从客户端返回结果。ContentResolver方法可以提供基本功能。
ongreate方法
B.我们可以使用监视数据的更改来观察数据是否更改。LET查看简单的演示:
C.如何使用Curdapp启动来发现和调用您的组件,因此我们需要在此处定义
使用合并的属性解决任何冲突条目并合并在一起。使用,这使我们可以找到。
例如:1。LeakCanary尚未集成应用启动,因此我们如何使用?首先,我们转到AndroidManifest.xml以查找Leakcanary的
然后我们在androidManifest.xml中找到这两个,然后添加
目前,我们可以控制应用程序启动中的初始化并快乐地播放
其次,Workmanager当前没有集成应用启动,因此让我们自己扩展以实现初始化器,然后查看依赖项的使用()
类CustomProvider:contentProvider(){{){
替代趣味():boolean {
//返回trie以指示成功的初始化
//返回false以指示初始化的失败
}
覆盖趣味查询(URI:URI,项目:数组
//查询数据返回光标。如果是另一个游戏玩法,您可以返回null
}
替代有趣的getType(uri:uri):字符串?{
//如果没有类型,您可以直接返回null
}
覆盖娱乐插入(uri:uri,values:contentvalues?):uri?{
//插入数据并返回到URI。如果是另一个游戏玩法,您可以返回null
}
替代娱乐删除(URI:URI,选择:string?,, selectionargs:array
//删除数据并返回行数。如果是另一个游戏玩法,返回-1也可以
}
覆盖娱乐更新(uri:uri,values:contentvalues?,selection:string?,, selectionargs:array
//更新数据,返回行数,如果是另一个游戏玩法,返回-1也可以
}
} 7我们还需要删除工人默认值
依赖我们
游戏玩法如下:(1)。我们可以定义扩展的xxxinitializer的扩展,以替换第三党性权力的关注者,然后依靠扩展扩展扩展扩展扩展的扩展的扩展。Libary ContentProvider可以写在自定义初始化器的ongreate()中。
我们在上面使用了它,它是一个contentprovider
initialization -provider#oncreate获取内容提供商信息,数据,初始化初始化器和执行调用
DiscoverAndInitialize()逻辑如下:(1)。通过packageManager.getProviderInfo获取内容提供商信息(2)。穿越元数据键列表,值是否等于Androidx.startup(3)。条件匹配是成功的,执行doInitialize(组件,ins,治疗
doinialize步骤如下:(1)。在初始化的初始化中,如果包含组件,则需要扔掉。(2)。在缓存地图集合中没有组件进行销售:初始化,实例化初始化器的初始化集合(初始化)的第一个记录组件。检查集合是否有数据。如果有数据,则需要递归调用。如果数据没有直接执行数据,则将组件从初始化的主机集(初始化)中删除,然后将组件添加到高速缓存的MAP收集销售中。(3)。缓存地图集合在销售中具有组件,并直接从地图集合中的GET返回而无需重复初始化。(4)。从上面的代码分析中可以看到:在初始化器中执行,最后执行
App启动Multi -ContentProvider具有时间 - 耗费比较。默认比较值是参考的原始APK
我们使用三个设备进行测试比较():
结论如下:统一管理,简化起始顺序并清楚地设置初始化的顺序。如果每个Libary Library开发人员都有一个content -provider来初始化它,则不方便地管理。设计的原始意图应该是收集ContentProvider,实际上对开始优化并不特别有用。从contentprovider中的数据初始化之后,如果您使用线程池异步来在项目中大多数数据中初始化某些数据,那么此时无需使用应用程序启动。
我们可以从测试数据比较中看到:使用时,如果使用应用程序启动,则可能无法缩短应用程序的启动时间。但是在多个不同的性能设备()上,应用程序启动启动时间将有点一点比使用短。
阅读了上述内容后,我认为每个人都应该知道何时使用它,如何使用它以及为什么。这样,就可以实现本文的目的。
作者:哈利法克斯