1.引言
最近开发了一个开机向导的项目。记录下整个项目的收获,以及问题。供以后参考
2.正题
开机向导是整个Android的第一个程序。它具备以下特性:
- 走完开机向导,不会走第二遍
- 优先级比launcher还高
- 开机向导中自动禁用了Home键等
- 开发开机向导App,首先要在AndroidManifest 声明 改软件是开机向导:
<intent-filter android:priority="1000">
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.SETUP_WIZARD" />//开机向导
<category android:name="android.intent.category.HOME" />// Home程序
</intent-filter>
- 开机向导走完了一遍,不会走第二遍的原因是,系统记录了一些flag值。在开机向导最后一个界面的时候,执行如下方法,设置flag值
private void finishSetupWizard() {
// Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
PackageManager pm = getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK) == true) {
Settings.Secure.putInt(getContentResolver(), Settings.Secure.TV_USER_SETUP_COMPLETE, 1);
}
// remove this activity from the package manager.
ComponentName name = new ComponentName(this, DefaultActivity.class); //替换成自己的开机向导 第一个界面。代表禁用四大组件
pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
finish();
}
3.为了方便开发调试。可以通过以下命令,来更改上面的flag值:
adb root
adb remount
adb shell
settings put global device_provisioned 0
settings put secure user_setup_complete 0
//开启开机向导的第一个activity
pm enable com.android.provision/com.android.provision.DefaultActivity
sync //需要等待几秒钟 刷新数据
reboot
重启之后,又进入到了开机向导。
4.开发完毕开机向导,需要内置于系统,并且要覆盖系统默认的开机向导程序。并且还得系统签名,还得放在system/app 或者privte-app下。核心的Android.bp 配置
android_app_import {
name: "SetUpWizard",
apk: "SetUpWizard/SetUpWizard.apk",
certificate: "platform",
privileged: true,
overrides: ["Provision"],
}
网友评论