1.设置了开机向导的相关属性却没有优先启动
<activity android:name="DefaultActivity"
android:excludeFromRecents="true"
android:exported="true">
<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.DEFAULT"/>
<category android:name="android.intent.category.SETUP_WIZARD"/>
</intent-filter>
</activity>
原因:开机向导应用如果不放在system_ext/priv-app/下,设置了“android:priority=1”也会被重置会0,如果使用源码编译,在Android.dp文件中设置“system_ext_specific: true”即可
2.每次重启重复进入开机向导问题
// 添加持久设置以允许其他应用程序知道设备已配置。
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
//这个标记位标识当前用户已经走完引导流程,如果不设置这个值,Home键、锁屏等将不可用
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
// 从PackageManager中禁用该Activity。
PackageManager pm = getPackageManager();
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
走完开机向导流程后,设置相关标记位,并将该Activity禁用,最后finish自己进入launch界面(设置相关标记位可以让其他服务知道设备可用,如锁屏服务可用,启用Home键功能等,将该Activity禁用可以让下次开机时我们的应用不会再起来而直接启动桌面)
注:有些人用frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java类中重新设置默认启动的launch来规避此问题,并用全局变量来控制,此方法没有找到根本问题点,且规避产生的代码块使得整体逻辑更加复杂,不可取