前言
在设备首次开机的时候我们往往会给与用户一些操作提示,比如如何对焦、遥控器配对等,这个时候就需要一个界面在Launcher启动之前呈现给用户,这个界面就是所谓的开机向导,本质上开机向导就是一个普通apk,只不过在系统启动之前启动了而已,下面就简单介绍下如何配置一个Android应用为开机向导。
编码
首先,开机向导得在Launcher启动之前启动,所以其优先级必须必Launcher高,所以在AndroidManifest.xml中配置如下:
<activity android:name=".WizardActivity" android:label="@string/app_name" > <intent-filter android:priority="1" > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </activity>
将本Activity配置为android.intent.category.HOME,然后优先级为1(越大优先级越高),这样我们的应用就会在Launcher之前启动了。
应用启动之后的流程就和普通应用一样了,可以在开机向导中启动其他app,由于开机向导只在系统第一次启动之前启动,所以开机向导关闭的时候需要将自己设置为不在启动。
PackageManager pm = getActivity().getPackageManager(); ComponentName name = new ComponentName(getActivity(),WizardActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
同时需要告诉系统开机向导已经完成了,需要写入如下属性到系统中(需要系统权限)。
Settings.Global.putInt(getActivity().getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); Settings.Secure.putInt(getActivity().getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
通过上面简单两步我们的apk就可以被当做开机向导了(apk需要系统签名)。
其他
使用shell命令可以直接获取上面最后写入的两个属性
//写入 settings put global device_provisioned 1 settings put secure user_setup_complete 1 //获取 settings get global device_provisioned settings get secure user_setup_complete
需要注意的事,不管什么时候,我们一定要写入系统属性以及将自身设置为不可用,如果没有将自身设置为不可用,那么开机向导finish自己以后马上会被系统启动,如果没有写入系统上面贴出的两个属性,那么第二次开机将会出现异常(开机向导未完成,但是开机向导被设置为不可用了)。