开机向导两三事

来源:互联网 发布:红色警戒2网络打不开 编辑:程序博客网 时间:2024/04/25 22:43

这段时间一直搞开机向导。大概记录一下。
其实开机向导没有什么复杂的场景,是个比较简单的apk,只是作为第一个应用,有些特殊。

1.首先,开机向导最根本的目的,是为了完成:

Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);

这两个值在很多地方都会有影响,比如SystemUI中,很多地方都会根据这两个值,做出一些限制。

2.其次,开机向导工作量较大的地方,就是在和Settings中模块交互的地方:

a).WifiSettings,如果开机向导中有wifi设置的界面,那么就会与这个类有关系,此类修改需要谨慎。b).ChooseLockXXXX。如果开机向导中有锁屏密码设置的界面,那么就会与这几个类有关,这几个类在重用的时候要谨慎,最好能直接重用。c).Fingerprint.同上,指纹相关的界面也是如此。  

这几处地方,由于与原有模块相关性很高,容易在修改时引入问题,需要慎重。

3.其他:

a).开机向导会在结束时disable掉自己,比如在原生的开机向导中,会调用:

ComponentName name = new ComponentName(this, DefaultActivity.class);pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,    PackageManager.DONT_KILL_APP);

以此来使得开机向导只在用户眼中出现一次,恢复出厂才会再出现。

另外的,也可以关注下setApplicationEnabledSetting(String appPackageName,int newState, int flags, int userId, String callingPackage)这个方法

b).在原生的开机向导中其实还有设置launcher的操作。只不过我们基本没有这种使用的场景。

  //if Launcher3 is not found, do not set anything    if(defaultMatch == -1){        return;    }    IntentFilter filter = new IntentFilter();    filter.addAction(Intent.ACTION_MAIN);    filter.addCategory(Intent.CATEGORY_HOME);    filter.addCategory(Intent.CATEGORY_DEFAULT);    pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);

c).开机向导也可能会与其他模块有相互调用,比如说,某个项目上需要在开机向导中设置主题。
这时候调用跳转容易出问题,需要在关键点输出log。

d).在开机向导之前会有启动一个FallbackHome类,此类的作用就是在isUserUnlocked后启动Home属性的apk。

private void maybeFinish() {        if (getSystemService(UserManager.class).isUserUnlocked()) {            final Intent homeIntent = new Intent(Intent.ACTION_MAIN)                    .addCategory(Intent.CATEGORY_HOME);            final ResolveInfo homeInfo = getPackageManager().resolveActivity(homeIntent, 0);            if (Objects.equals(getPackageName(), homeInfo.activityInfo.packageName)) {                Log.d(TAG, "User unlocked but no home; let's hope someone enables one soon?");                mHandler.sendEmptyMessageDelayed(0, 500);            } else {                Log.d(TAG, "User unlocked and real home found; let's go!");                getSystemService(PowerManager.class).userActivity(                        SystemClock.uptimeMillis(), false);                finish();            }        }    }

为什么是FallbackHome?

  ——这是因为Settings中配置了android:directBootAware="true"这个属性。

这个属性是干啥的?

  ——粘贴一下:        当手机已经通电开机但是用户并有解锁锁屏的时候,Android N运行于一个安全的模式,也就是Dierect Boot模式。        为了支持Dierect Boot模式,系统提供了两个存储数据的地方:        1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。        2.Device encrypted storage,主要对应的就是Direct Boot使用的存储空间。在Direct Boot模式下和用户解锁手机后都可以使用的存储空间。  引用自[Android7.0 DirectBoot阻塞开机分析](http://blog.csdn.net/fu_kevin0606/article/details/65437594)

e)其他的开机向导.有其他一些厂商的开机向导是以activity中viewpager切换fragment的方式来实现的,整个APK只维持两个Activity,并且基本上所有的界面都是在该APK内实现的.这样的好处是显而易见的—-便于移植.