Android開發(fā)中一些注意事項和遇到的問題(持續(xù)更新)
1.LiveData使用:
setValue()
調(diào)用線程:setValue() 方法只能在主線程(UI 線程)上調(diào)用。如果你在其他線程(如后臺線程或工作線程)上調(diào)用它,會拋出異常。
同步性:由于 setValue() 是在主線程上執(zhí)行的,因此它是同步的。這意味著它會立即更新 LiveData 的值并通知觀察者。
postValue()
調(diào)用線程:postValue() 方法可以在任何線程上調(diào)用,包括主線程和其他線程。這使得它在后臺線程中更新 UI 數(shù)據(jù)時特別有用。
異步性:postValue() 不是立即更新 LiveData 的值。相反,它會將值放入一個隊列中,并在主線程的消息隊列中排隊一個消息,以便稍后在主線程上執(zhí)行。
當(dāng)主線程處理這個消息時,它會從隊列中取出值并更新 LiveData,然后通知觀察者。因此,postValue() 是異步的。
liveData沒setValue過值,獲取值會是null,postValue后需要在UI主線程getValue調(diào)用,防止crash.
2.regiterListener和get調(diào)用順序。
需要先regiterListener完再調(diào)用get,不然兩個調(diào)用中間消息會被漏掉。
3.App權(quán)限的使用:(首先A app需要在manifest里將權(quán)限級別設(shè)置為normal)
使用dumpsys package com.iauto.xxxx dump權(quán)限信息:
A app已經(jīng)定義iauto.permission.XX的級別為normal,為何testApp B 追加<use permission>后 dump下來的權(quán)限還是如下:
requested permissions:
iauto.permission.xxxx
install permissions:
iauto.permission.xx: granted=false
原因是需要需要重新安裝testApp來重新觸發(fā)權(quán)限
--》
先安裝A app,然后重新后安裝testApp
4.BroadCast使用
registerReceiver RECEIVER_NOT_EXPORTED和 RECEIVER_EXPORTED的區(qū)別
所以當(dāng)一個廣播從系統(tǒng)廣播變?yōu)槠胀◤V播后,需要追加廣播權(quán)限,讓接收的模塊都配置為“Intent.FLAG_RECEIVER_EXPORTED”
4.1. RECEIVER_EXPORTED(已導(dǎo)出)
標(biāo)志:Intent.FLAG_RECEIVER_EXPORTED
行為:
接收器會被標(biāo)記為可被其他應(yīng)用訪問(相當(dāng)于在 AndroidManifest.xml 中靜態(tài)注冊時設(shè)置 android:exported="true")。
其他應(yīng)用可以通過 sendBroadcast() 發(fā)送匹配的 Intent 到此接收器。
適用于需要跨應(yīng)用通信的場景(例如系統(tǒng)廣播或自定義全局廣播)。
風(fēng)險:
如果接收器處理敏感操作(如權(quán)限驗證、數(shù)據(jù)修改),惡意應(yīng)用可能通過發(fā)送偽造廣播觸發(fā)接收器,導(dǎo)致安全漏洞。
解決方案:確保接收器有適當(dāng)?shù)臋?quán)限檢查(如 android:permission),或僅在必要時導(dǎo)出。
4.2. RECEIVER_NOT_EXPORTED(未導(dǎo)出)
標(biāo)志:Intent.FLAG_RECEIVER_NOT_EXPORTED
行為:
接收器僅限當(dāng)前應(yīng)用內(nèi)部使用(相當(dāng)于 android:exported="false")。
只有同一應(yīng)用的組件(如 Activity、Service)或具有相同用戶 ID 的應(yīng)用才能發(fā)送廣播到此接收器。
系統(tǒng)廣播(如 ACTION_BATTERY_CHANGED)仍可被接收,因為系統(tǒng)本身有權(quán)限。
適用場景:
接收器處理應(yīng)用內(nèi)部邏輯(如后臺任務(wù)、狀態(tài)更新),無需與其他應(yīng)用交互。
更安全,推薦默認(rèn)使用。
5.ContentProvider的cursor.close確認(rèn)在每個分支都有調(diào)用,以及捕獲SQLiteException異常處理。

浙公網(wǎng)安備 33010602011771號