源码路径:android/packages/apps/Provision
在Android的原生代码中,Priovision只是一个第一次启动的设置向导,引导用户第一次使用机器设置语言、Wifi等等。
启动顺序:1.Provision ---> launcher ----> 按系统顺序执行流程
Provision在其AndroidManifest.xml中被定义如下:
Activity DefaultActivity的category被定义成HOME,并且priority为1,是比系统Launcher启动还要早的程序。
Provision中DefaultActivity的实现如下:
- package com.android.provision;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Environment;
import android.content.res.AssetManager;
/**
* Application that sets the provisioned bit, like SetupWizard does.
*/
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./*//要添加的启动代码
*/
- //开机后完成设置后,设置这两个标志;设置后才顺序launcher启动,启动整个系统流程
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);
// terminate the activity.
finish();
}
}