Android开机向导构建流程

/ 0评 / 3

前言

在设备首次开机的时候我们往往会给与用户一些操作提示,比如如何对焦、遥控器配对等,这个时候就需要一个界面在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自己以后马上会被系统启动,如果没有写入系统上面贴出的两个属性,那么第二次开机将会出现异常(开机向导未完成,但是开机向导被设置为不可用了)。

参考:http://blog.csdn.net/hitbeauty/article/details/46827085

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注