<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
nowinandroid專案作為目前google官方來演示MAD(現代Android開發技術)的範例專案,裡面大量依賴運用了jetpack包下的各種庫。通過分析學習這些庫在項中的實際使用可以幫助我們比直接閱讀庫的檔案來更好的理解和學習。希望通過學習後可以幫助到我們能熟練地在我們自己的專案中正確高效的使用到jetpack裡面的各種強大庫。不廢話了,下面進入我們今天的正題——Startup
App Startup | Android Developers 官網的指南有興趣可以看看
我們今天不講原理,你只需知道這個庫比之前用多個content provider去實現初始化更高效,更精確,更顯性,也就是說能合併content provider提升app的啟動速度,能準確的控制初始化順序,能清晰的從程式碼知道依賴關係。僅僅這些可能jym會說,我們專案不在乎那點啟動速度的提升,也沒有很多三方庫需要走初始化等,根本用不到這個庫。
是的,我之前也是這麼理解的,但是通過nowinandroid專案發現,有些jetpack內的其他庫的初始化現在也交給Startup來完成了,這一點就很重要了。意味著我們可以少寫很多樣板程式碼,少寫也意味著少犯錯。所以我覺的還是有必要單獨寫一篇文章來說說Startup
編寫初始化的程式碼步驟很簡單主要就分3步:
Initializer
介面的實現類OK了!就這簡單3步,下面我們結合專案例子來看
object Sync { // This method is a workaround to manually initialize the sync process instead of relying on // automatic initialization with Androidx Startup. It is called from the app module's // Application.onCreate() and should be only done once. fun initialize(context: Context) { AppInitializer.getInstance(context) .initializeComponent(SyncInitializer::class.java) } } internal const val SyncWorkName = "SyncWorkName" /** * Registers work to sync the data layer periodically on app startup. */ class SyncInitializer : Initializer<Sync> { override fun create(context: Context): Sync { WorkManager.getInstance(context).apply { // Run sync on app startup and ensure only one sync worker runs at any time enqueueUniqueWork( SyncWorkName, ExistingWorkPolicy.KEEP, SyncWorker.startUpSyncWork(), ) } return Sync } override fun dependencies(): List<Class<out Initializer<*>>> = listOf(WorkManagerInitializer::class.java) }
定一個SyncInitializer
類實現了泛型為Sync
的Initializer
介面。需要重寫介面定義的兩個方法:
create()
方法, 它包含初始化元件所需的所有操作,並返回一個Sync
的範例.dependencies()
方法, 返回當前初始化器需要依賴的其他初始化器集合,我們可以用這個方法來變相的實現各個初始化器的執行順序。所以在create
方法裡面的執行WorkManager.getInstance(context)
方法是安全的。我們這篇只關注Startup所以我們只用知道在這個地方WorkManager做了些事情就行,後面會另開一篇單獨講WorkManager。為啥是安全的呢?因為在dependencies
方法裡面先執行了WorkManagerInitializer::class.java
初始化。我們再來看看這個類。
public final class WorkManagerInitializer implements Initializer<WorkManager> { private static final String TAG = Logger.tagWithPrefix("WrkMgrInitializer"); @NonNull @Override public WorkManager create(@NonNull Context context) { // Initialize WorkManager with the default configuration. Logger.get().debug(TAG, "Initializing WorkManager with default configuration."); //這個地方已經完成了單例的構建,後面再呼叫WorkManager.getInstance(context)獲取範例,否則報錯 WorkManager.initialize(context, new Configuration.Builder().build()); return WorkManager.getInstance(context); } @NonNull @Override public List<Class<? extends androidx.startup.Initializer<?>>> dependencies() { //這裡WorkManager的初始化不需要其他初始化構造器,所以返回的是個空集合 return Collections.emptyList(); } }
以上我們就把第一步走完了,現在再來看第二步
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- TODO: b/2173216 Disable auto sync startup till it works well with instrumented tests --> <meta-data android:name="com.google.samples.apps.nowinandroid.sync.initializers.SyncInitializer" android:value="androidx.startup" tools:node="remove" /> </provider> </application> </manifest>
這裡需要注意的是tools:node="remove"
,在provider層級用的話是全域性取消自動初始化,在meta-data層級用的話是單個元件取消自動初始化。例子展示的是單個元件取消自動初始化。另外注意的一點是被依賴的初始化元件是不需要再另外在manifest裡面宣告的,這就是為什麼WorkManagerInitializer
沒有宣告。
@HiltAndroidApp class NiaApplication : Application(), ImageLoaderFactory { override fun onCreate() { super.onCreate() // Initialize Sync; the system responsible for keeping data in the app up to date. Sync.initialize(context = this) } /** * Since we're displaying SVGs in the app, Coil needs an ImageLoader which supports this * format. During Coil's initialization it will call `applicationContext.newImageLoader()` to * obtain an ImageLoader. * * @see <a href="https://github.com/coil-kt/coil/blob/main/coil-singleton/src/main/java/coil/Coil.kt" rel="external nofollow" >Coil</a> */ override fun newImageLoader(): ImageLoader { return ImageLoader.Builder(this) .components { add(SvgDecoder.Factory()) } .build() } }
上面的程式碼是app的Application,我們今天的重點是Startup,所以我們先不管其他的。只用看onCreate
下的Sync.initialize(context = this)
方法。
object Sync { // This method is a workaround to manually initialize the sync process instead of relying on // automatic initialization with Androidx Startup. It is called from the app module's // Application.onCreate() and should be only done once. fun initialize(context: Context) { AppInitializer.getInstance(context) .initializeComponent(SyncInitializer::class.java) } }
AppInitializer.getInstance(context).initializeComponent(SyncInitializer::class.java)
傳入SyncInitializer
類,實現手動初始化完成。
以上就是nowinandroid專案對Startup庫的使用,並且上面我們也知道了我們自定義的初始化器在初始化的時候通過WorkManager做了些事情。那麼下篇我們還是通過這個例子來看看nowinandroid是怎麼使用WorkManager這個庫的,更多關於官網Jetpack Startup庫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45