Android模块拆分后随APP自启动

[复制链接]
回帖奖励 4 金钱      回复本帖可获得 2 金钱奖励! 每人限 1 次
查看582 | 回复3 | 2024-11-12 08:49:56 | 显示全部楼层 |阅读模式
本帖最后由 qq243559086 于 2024-11-12 11:45 编辑

在爱星物联Android APP开发中,很多的模块需要随着APP的启动而自启动(例如服务注册等),而非是开发者在Application 类或者Activity类的生命周期中手写代码调用启动。这样做的好处是,1减少代码的耦合,2可以避免重复启动。
有两种方式可以做到模块随APP的启动而自启动:
方式一:
自定义一个ContentProvider类,原理就是Android系统在启动APP时会启动ContentProvider,然后在ContentProvideronCreate中启动模块的服务即可。很多第三方库的自启动就是用的这个原理。
示例代码:
  1. // 自定义一个AutoInitProvider 用来自启动
  2. public class AutoInitProvider extends ContentProvider {
  3.     @Override
  4.     public boolean onCreate() {
  5.         Context context = getContext();
  6.         if (null == context) return false;
  7.         // 这里写你的启动逻辑
  8.         return false;
  9.     }

  10.     @Override
  11.     public int delete(Uri uri, String selection, String[] selectionArgs) {
  12.         throw new UnsupportedOperationException("Not yet implemented");
  13.     }
  14.     @Override
  15.     public String getType(Uri uri) {
  16.         throw new UnsupportedOperationException("Not yet implemented");
  17.     }
  18.     @Override
  19.     public Uri insert(Uri uri, ContentValues values) {
  20.         throw new UnsupportedOperationException("Not yet implemented");
  21.     }
  22.     @Override
  23.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
  24.         throw new UnsupportedOperationException("Not yet implemented");
  25.     }
  26.     @Override
  27.     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
  28.         throw new UnsupportedOperationException("Not yet implemented");
  29.     }
  30. }
  31. // 别忘了还要在模块的AndroidManifest.xml 中注册
  32. <provider
  33.     android:name=".AutoInitProvider"
  34.     android:authorities="${applicationId}.yourmodule.auto-init"
  35.     android:enabled="true"
  36.     android:exported="false"
  37. android:initOrder="1000"/>
复制代码
方式二:
使用Google提供的第三方库 "androidx.startup:startup-runtime:1.2.0"。此库是方式一的升级版,其底层实现也是用的方式一。由于太多的第三方库使用自定义ContentProvider,会导致APP启动变慢。为了优化这种情况,Google推出了androidx.startup:startup-runtime 库,其原理就是把所有的库自启动放在一个ContentProvider中进行,从而减少了自定义ContentProvider的数量。
示例代码:
  1. // 自定义一个 Initializer
  2. import androidx.annotation.NonNull;
  3. import androidx.annotation.Nullable;
  4. import androidx.startup.Initializer;

  5. public class PushInitializer implements Initializer<Void> {

  6.     @NonNull
  7.     @Override
  8.     public Void create(@NonNull Context context) {
  9.         // 这里写你的自启动逻辑
  10.         return null;
  11.     }

  12.     @NonNull
  13.     @Override
  14.     public List<Class<? extends Initializer<?>>> dependencies() {
  15.         // 这里返回依赖的其他优先启动
  16.         return Collections.emptyList();
  17.     }
  18. }

  19. // 别忘了还要在模块的AndroidManifest.xml 中注册
  20. <provider
  21.     android:name="androidx.startup.InitializationProvider"
  22.     android:authorities="${applicationId}.androidx-startup"
  23.     android:exported="false"
  24.     tools:node="merge">
  25.     <meta-data
  26.         <!-- 这里换成上面自定义的Initializer类的全名,其他的不变 -->
  27.         android:name="com.xxx.xxx.PushInitializer"
  28.         android:value="androidx.startup" />
  29. </provider>
复制代码



回复

使用道具 举报

花花 | 2024-11-12 09:24:56 | 显示全部楼层

回帖奖励 +2 金钱

学到了
Less is more.
回复

使用道具 举报

浅末哈哈 | 2024-11-12 09:31:26 | 显示全部楼层

回帖奖励 +2 金钱

学习学习
回复

使用道具 举报

大猫的鱼 | 2024-11-12 23:43:32 | 显示全部楼层

回帖奖励 +2 金钱

学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则