因為需求有做開機引導(dǎo)冀宴,所以簡單的學(xué)習(xí)下這塊功能的流程,并簡單的做個總結(jié)
主要參考文章:
http://www.reibang.com/p/d2951f6fb2a8
https://blog.csdn.net/ansondroider/article/details/103297638
做開機引導(dǎo)温学,主要要做到的效果就是只有第一次使用的時候會打開略贮,只打開一次,當(dāng)執(zhí)行完開機引導(dǎo)的流程之后仗岖,之后開機都不會再展示
要實現(xiàn)開機引導(dǎo)逃延,那么就一定是系統(tǒng)應(yīng)用,按照原理來說轧拄,需要兩個步驟真友,第一,需要引導(dǎo)頁的優(yōu)先級比LAUNCHER高紧帕。第二盔然,需要流程完畢之后執(zhí)行某些操作讓應(yīng)用下次不會啟動桅打。
1. 設(shè)置應(yīng)用的優(yōu)先級
可以設(shè)置android:priority屬性,系統(tǒng)會判斷啟動priority優(yōu)先級高的愈案。
<activity android:name=".ProvisionedActivity">
<intent-filter android:priority="1">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.COMMON_HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
這樣配置之后挺尾,其它應(yīng)用的優(yōu)先級如果沒有設(shè)置的話默認就是0,這樣就會優(yōu)先打開引導(dǎo)頁站绪。
2. 引導(dǎo)頁只開啟一次
自己可以在引導(dǎo)頁中寫自己想要做的邏輯遭铺。當(dāng)執(zhí)行完所有邏輯之后,需要配置
// Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Global.putInt(contentResolver, Settings.Global.DEVICE_PROVISIONED, 1)
Settings.Secure.putInt(contentResolver, Settings.Secure.USER_SETUP_COMPLETE, 1)
// remove this activity from the package manager.
PackageManager pm = context.getPackageManager();
ComponentName componentName = new ComponentName(packageName, activityName);
pm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
這里主要做了設(shè)置Settings.Global.DEVICE_PROVISIONED和Settings.Secure.USER_SETUP_COMPLETE兩個參數(shù)恢准,還有PackageManager.setComponentEnabledSetting方法禁用組件
第一個參數(shù)是組件名
第二個參數(shù)是狀態(tài)
不可用狀態(tài):COMPONENT_ENABLED_STATE_DISABLED
可用狀態(tài):COMPONENT_ENABLED_STATE_ENABLED
默認狀態(tài):COMPONENT_ENABLED_STATE_DEFAULT
第三個參數(shù)flags
DONT_KILL_APP或者0魂挂,0表示殺死包含該組件的app
3. 使用過程中出現(xiàn)的問題
(1)priority設(shè)置無效
運行時會發(fā)現(xiàn)設(shè)置priority優(yōu)先級比LAUNCHER高,在開機之后也會提示讓你選擇打開應(yīng)用馁筐,而不是默認打開優(yōu)先級高的涂召,關(guān)于這個問題,可以參考這篇文章
https://blog.csdn.net/ansondroider/article/details/103297638
只需要把應(yīng)用安裝到system/priv-app中敏沉,就能解決這個問題果正。正常來說一般系統(tǒng)應(yīng)用也是安裝在這么文件夾中,只是平時調(diào)試的時候會為了方便直接run盟迟,所以可能出現(xiàn)這個問題秋泳。
將應(yīng)用安裝到該文件夾中可以使用這個命令,然后重啟
adb push xxx.apk /system/priv-app
(2)不設(shè)置Settings.Global.DEVICE_PROVISIONED和Settings.Secure.USER_SETUP_COMPLETE
看了很多文章攒菠,都沒有講到為什么要設(shè)置這兩屬性迫皱,因為要達成目的,我們只需要設(shè)置priority和調(diào)用setComponentEnabledSetting方法就行辖众,為什么要設(shè)置這兩個參數(shù)舍杜?不設(shè)置會有什么影響。
其實簡單來說赵辕,系統(tǒng)在其他地方有用到這兩個參數(shù)既绩,舉個簡單的例子,我直接
Settings.Global.putInt(contentResolver, Settings.Global.DEVICE_PROVISIONED, 0)
Settings.Secure.putInt(contentResolver, Settings.Secure.USER_SETUP_COMPLETE, 0)
去運行程序还惠,能夠很明顯的測出這種情況下按Home鍵沒反應(yīng)饲握,除此之外屏保也會不顯示。
所以這兩個參數(shù)還是需要在這個地方設(shè)為1的蚕键。