本帖最后由 qq243559086 于 2024-11-12 11:45 编辑
在爱星物联Android APP开发中,很多的模块需要随着APP的启动而自启动(例如服务注册等),而非是开发者在Application 类或者Activity类的生命周期中手写代码调用启动。这样做的好处是,1、减少代码的耦合,2、可以避免重复启动。 有两种方式可以做到模块随APP的启动而自启动: 方式一: 自定义一个ContentProvider类,原理就是Android系统在启动APP时会启动ContentProvider,然后在ContentProvider的onCreate中启动模块的服务即可。很多第三方库的自启动就是用的这个原理。 示例代码: - // 自定义一个AutoInitProvider 用来自启动
- public class AutoInitProvider extends ContentProvider {
- @Override
- public boolean onCreate() {
- Context context = getContext();
- if (null == context) return false;
- // 这里写你的启动逻辑
- return false;
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- @Override
- public String getType(Uri uri) {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- throw new UnsupportedOperationException("Not yet implemented");
- }
- }
- // 别忘了还要在模块的AndroidManifest.xml 中注册
- <provider
- android:name=".AutoInitProvider"
- android:authorities="${applicationId}.yourmodule.auto-init"
- android:enabled="true"
- android:exported="false"
- android:initOrder="1000"/>
复制代码方式二: 使用Google提供的第三方库 "androidx.startup:startup-runtime:1.2.0"。此库是方式一的升级版,其底层实现也是用的方式一。由于太多的第三方库使用自定义ContentProvider,会导致APP启动变慢。为了优化这种情况,Google推出了androidx.startup:startup-runtime 库,其原理就是把所有的库自启动放在一个ContentProvider中进行,从而减少了自定义ContentProvider的数量。 示例代码: - // 自定义一个 Initializer
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.startup.Initializer;
- public class PushInitializer implements Initializer<Void> {
- @NonNull
- @Override
- public Void create(@NonNull Context context) {
- // 这里写你的自启动逻辑
- return null;
- }
- @NonNull
- @Override
- public List<Class<? extends Initializer<?>>> dependencies() {
- // 这里返回依赖的其他优先启动
- return Collections.emptyList();
- }
- }
- // 别忘了还要在模块的AndroidManifest.xml 中注册
- <provider
- android:name="androidx.startup.InitializationProvider"
- android:authorities="${applicationId}.androidx-startup"
- android:exported="false"
- tools:node="merge">
- <meta-data
- <!-- 这里换成上面自定义的Initializer类的全名,其他的不变 -->
- android:name="com.xxx.xxx.PushInitializer"
- android:value="androidx.startup" />
- </provider>
复制代码
|