设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间10 现在时间10 缓存数据 只要你的心是晴的,人生就没有雨天。就像好事情总是发生在那些微笑着的人身上。调整心情,保持微笑。早安!

只要你的心是晴的,人生就没有雨天。就像好事情总是发生在那些微笑着的人身上。调整心情,保持微笑。早安!

查看: 1511|回复: 3

官网项目Jetpack Startup库学习

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:226
  • 打卡月天数:0
  • 打卡总奖励:3523
  • 最近打卡:2025-03-13 12:07:03
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
429
主题
394
精华
0
金钱
4788
积分
880
注册时间
2023-1-6
最后登录
2025-6-1

发表于 2023-3-2 11:29:40 | 显示全部楼层 |阅读模式
简单认识一下Startup

nowinandroid项目作为目前google官方来演示MAD(现代Android开发技术)的示例项目,里面大量依赖运用了jetpack包下的各种库。通过分析学习这些库在项中的实际使用可以帮助我们比直接阅读库的文档来更好的理解和学习。希望通过学习后可以帮助到我们能熟练地在我们自己的项目中正确高效的使用到jetpack里面的各种强大库。不废话了,下面进入我们今天的正题——Startup
123013gcbfk0cm6ccxfc11.png

App Startup  |  Android Developers 官网的指南有兴趣可以看看
我们今天不讲原理,你只需知道这个库比之前用多个content provider去实现初始化更高效,更精确,更显性,也就是说能合并content provider提升app的启动速度,能准确的控制初始化顺序,能清晰的从代码知道依赖关系。仅仅这些可能jym会说,我们项目不在乎那点启动速度的提升,也没有很多三方库需要走初始化等,根本用不到这个库。
是的,我之前也是这么理解的,但是通过nowinandroid项目发现,有些jetpack内的其他库的初始化现在也交给Startup来完成了,这一点就很重要了。意味着我们可以少写很多样板代码,少写也意味着少犯错。所以我觉的还是有必要单独写一篇文章来说说Startup
编写初始化的代码步骤很简单主要就分3步:

  • 定义实现
    1. Initializer
    复制代码
    接口的实现类
  • 配置manifest
  • 自动或手动调用初始化操作
OK了!就这简单3步,下面我们结合项目例子来看

项目代码


  • 先看第一步
  1. object Sync {
  2.     // This method is a workaround to manually initialize the sync process instead of relying on
  3.     // automatic initialization with Androidx Startup. It is called from the app module's
  4.     // Application.onCreate() and should be only done once.
  5.     fun initialize(context: Context) {
  6.         AppInitializer.getInstance(context)
  7.             .initializeComponent(SyncInitializer::class.java)
  8.     }
  9. }
  10. internal const val SyncWorkName = "SyncWorkName"
  11. /**
  12. * Registers work to sync the data layer periodically on app startup.
  13. */
  14. class SyncInitializer : Initializer<Sync> {
  15.     override fun create(context: Context): Sync {
  16.         WorkManager.getInstance(context).apply {
  17.             // Run sync on app startup and ensure only one sync worker runs at any time
  18.             enqueueUniqueWork(
  19.                 SyncWorkName,
  20.                 ExistingWorkPolicy.KEEP,
  21.                 SyncWorker.startUpSyncWork(),
  22.             )
  23.         }
  24.         return Sync
  25.     }
  26.     override fun dependencies(): List<Class<out Initializer<*>>> =
  27.         listOf(WorkManagerInitializer::class.java)
  28. }
复制代码
定一个
  1. SyncInitializer
复制代码
类实现了泛型为
  1. Sync
复制代码
  1. Initializer
复制代码
接口。需要重写接口定义的两个方法:

    1. create()
    复制代码
    方法, 它包含初始化组件所需的所有操作,并返回一个
    1. Sync
    复制代码
    的实例.
    1. dependencies()
    复制代码
    方法, 返回当前初始化器需要依赖的其他初始化器集合,我们可以用这个方法来变相的实现各个初始化器的执行顺序。
所以在
  1. create
复制代码
方法里面的执行
  1. WorkManager.getInstance(context)
复制代码
方法是安全的。我们这篇只关注Startup所以我们只用知道在这个地方WorkManager做了些事情就行,后面会另开一篇单独讲WorkManager。为啥是安全的呢?因为在
  1. dependencies
复制代码
方法里面先执行了
  1. WorkManagerInitializer::class.java
复制代码
初始化。我们再来看看这个类。
  1. public final class WorkManagerInitializer implements Initializer<WorkManager> {
  2.     private static final String TAG = Logger.tagWithPrefix("WrkMgrInitializer");
  3.     @NonNull
  4.     @Override
  5.     public WorkManager create(@NonNull Context context) {
  6.         // Initialize WorkManager with the default configuration.
  7.         Logger.get().debug(TAG, "Initializing WorkManager with default configuration.");
  8.         //这个地方已经完成了单例的构建,后面再调用WorkManager.getInstance(context)获取实例,否则报错
  9.         WorkManager.initialize(context, new Configuration.Builder().build());
  10.         return WorkManager.getInstance(context);
  11.     }
  12.     @NonNull
  13.     @Override
  14.     public List<Class<? extends androidx.startup.Initializer<?>>> dependencies() {
  15.         //这里WorkManager的初始化不需要其他初始化构造器,所以返回的是个空集合
  16.         return Collections.emptyList();
  17.     }
  18. }
复制代码
以上我们就把第一步走完了,现在再来看第二步

  • 再看第二步
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools">
  3.     <application>
  4.         <provider
  5.             android:name="androidx.startup.InitializationProvider"
  6.             android:authorities="${applicationId}.androidx-startup"
  7.             android:exported="false"
  8.             tools:node="merge">
  9.             <!--  TODO: b/2173216 Disable auto sync startup till it works well with instrumented tests   -->
  10.             <meta-data
  11.                 android:name="com.google.samples.apps.nowinandroid.sync.initializers.SyncInitializer"
  12.                 android:value="androidx.startup"
  13.                 tools:node="remove" />
  14.         </provider>
  15.     </application>
  16. </manifest>
复制代码
这里需要注意的是
  1. tools:node="remove"
复制代码
,在provider层级用的话是全局取消自动初始化,在meta-data层级用的话是单个组件取消自动初始化。例子展示的是单个组件取消自动初始化。另外注意的一点是被依赖的初始化组件是不需要再另外在manifest里面声明的,这就是为什么
  1. WorkManagerInitializer
复制代码
没有声明。

  • 最后一步
  1. @HiltAndroidApp
  2. class NiaApplication : Application(), ImageLoaderFactory {
  3.     override fun onCreate() {
  4.         super.onCreate()
  5.         // Initialize Sync; the system responsible for keeping data in the app up to date.
  6.         Sync.initialize(context = this)
  7.     }
  8.     /**
  9.      * Since we're displaying SVGs in the app, Coil needs an ImageLoader which supports this
  10.      * format. During Coil's initialization it will call `applicationContext.newImageLoader()` to
  11.      * obtain an ImageLoader.
  12.      *
  13.      * @see <a href="https://github.com/coil-kt/coil/blob/main/coil-singleton/src/main/java/coil/Coil.kt" rel="external nofollow" >Coil</a>
  14.      */
  15.     override fun newImageLoader(): ImageLoader {
  16.         return ImageLoader.Builder(this)
  17.             .components {
  18.                 add(SvgDecoder.Factory())
  19.             }
  20.             .build()
  21.     }
  22. }
复制代码
上面的代码是app的Application,我们今天的重点是Startup,所以我们先不管其他的。只用看
  1. onCreate
复制代码
下的
  1. Sync.initialize(context = this)
复制代码
方法。
  1. object Sync {
  2.     // This method is a workaround to manually initialize the sync process instead of relying on
  3.     // automatic initialization with Androidx Startup. It is called from the app module's
  4.     // Application.onCreate() and should be only done once.
  5.     fun initialize(context: Context) {
  6.         AppInitializer.getInstance(context)
  7.             .initializeComponent(SyncInitializer::class.java)
  8.     }
  9. }
复制代码
  1. AppInitializer.getInstance(context).initializeComponent(SyncInitializer::class.java)
复制代码
传入
  1. SyncInitializer
复制代码
类,实现手动初始化完成。
以上就是nowinandroid项目对Startup库的使用,并且上面我们也知道了我们自定义的初始化器在初始化的时候通过WorkManager做了些事情。那么下篇我们还是通过这个例子来看看nowinandroid是怎么使用WorkManager这个库的,更多关于官网Jetpack Startup库的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
-1
主题
6
精华
0
金钱
39
积分
30
注册时间
2022-12-25
最后登录
2023-6-20

发表于 2024-1-20 14:49:55 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2024-9-22 04:10:32 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-3-20 05:04:05 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表