Android Provision源码分析

Provision主要作用是作为开机引导用户进行一些基本设置。但是在原生的 android 系统中,这个 provision 非常的简单,只有一个空白的 activity,这个主要就是留给 厂商自己定制的,在Android中,寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<category android:name="android.intent.category.HOME" />)来过滤,而Provision的DefaultActivity中不仅配置了category.HOME,还增加了<intent-filter android:priority="1">,配置了权限为1,默认为0,如果有两个相同权限的,则弹框让用户选择启动哪一个。

<activity android:name="DefaultActivity" android:excludeFromRecents="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" />
    </intent-filter>
</activity>

packages/apps/Provision/src/com/android/provision/DefaultActivity.java

DefaultActivity代码如下:
public class DefaultActivity extends Activity {
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // 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);
        // remove this activity from the package manager.
        PackageManager pm = getPackageManager();
        ComponentName name = new ComponentName(this, DefaultActivity.class);
        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        //还可以在onCreate()方法里面添加其他方法如:默认关闭USB debug:
		Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0);  //0代表关闭,1代表打开
        // terminate the activity.
        finish();
    }
}

1、设置标签Settings.Global.DEVICE_PROVISIONED,标志代表了Android系统已过完开机向导准备完成,可以正常工作
2、禁止Provision自己的Activity组件

void setComponentEnabledSetting (ComponentName componentName, int newState, int flags) 

componentName:组件名称 
newState:组件新的状态,可以设置三个值,分别是如下:

不可用状态:COMPONENT_ENABLED_STATE_DISABLED
可用状态:COMPONENT_ENABLED_STATE_ENABLED
默认状态:COMPONENT_ENABLED_STATE_DEFAULT

猜你喜欢

转载自blog.csdn.net/zhangqi6627/article/details/107706635
今日推荐