Android 9.1 定制开机向导

简介

android开机向导一般是谷歌的应用,是没有源码的.但是谷歌提供了接口供OME自定义.能够简单实现在开机向导中增加自己界面的功能.自定义开机向导要两个部分.第一部分是要添加的用户界面.第二部分谷歌提供的客制化接口.需要注意的是不同android版本,可能定制的方法不一样.这里我记录的是android P版本.

编写需要加入的界面

加入开机向导的界面有以下要求:

  1. 对应的Activity能够通过action直接启动,如:adb shell am start -a ACTION
  2. 不能在操作完成之后finish掉activity,否则会弹回到上一个界面

这个官方文档例子

public class MyActivity extends Activity {
    private static final int NEXT_REQUEST_CODE = 1; // Can be any positive int
     //--------1--------//
    public void done(boolean success) {
        int resultCode = success ? Activity.RESULT_OK : ResultCodes.RESULT_SKIP;
        //--------2--------//
        Intent intent = WizardManagerHelper.getNextIntent(getIntent(), resultCode); //
        startActivityForResult(intent, NEXT_REQUEST_CODE);
        // finish();  // Optional. Calling finish will remove this activity from the
                      // back stack, such that this activity will be skipped if the
                      // user clicks back from the next screen.
    }
}

上面1处,done这个方法,是在用户点击skip或完成界面操作后调用,如果是跳过就返回RESULT_SKIP,否则RESULT_OK,这个返回值在后面的脚本配置用得上.后面的Finnish被官方注释掉,官方特别提示不能finish,亲测finish后,会直接返回到上一个界面,导致无法结束开机向导
上面2处对应的Intent,它的action是action com.android.wizard.NEXT,这个action是通知开机向导进入下一个界面.通过抓log可以发现,开机向导每一个界面的跳转都会发这个action

编写脚本加入自己的界面

以前是通过自己写apk来配置脚本,android 8后,谷歌在gms包内加一个GmsSampleIntegration应用,通过这个应用配置开机向导和launcher.这里我们要用其配置开机向导的功能.配置脚本在
vendor/google/apps/GmsSampleIntegration/res/raw

在config.xm定义了初始的脚本android.resource://com.google.android.gmsintegration/raw/wizard_script

脚本的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<WizardScript xmlns:wizard="http://schemas.android.com/apk/res/com.google.android.setupwizard"
    wizard:version="2">
    <!-- Welcome screen with language selection [RECOMMENDED, CUSTOMIZABLE] -->
       <!-- Set up fingerprint [RECOMMENDED, CUSTOMIZABLE] -->
    <WizardAction id="fingerprint"
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.FINGERPRINT;end">
        <result wizard:name="skip"
            wizard:resultCode="1"
            wizard:action="face_unlock" />
    <WizardAction id="face_unlock"
        wizard:uri="intent:#Intent;action=com.android.settings.suggested.FACEID_ENROLL;end" />

    </WizardAction>
 </WizardScript>

wizard:name: 是个标签,方便其他地方调用这个WizardAction
wizard:uri: 这个WizardAction对应的action,对应activity的action放在里面,
wizard:resultCode: 就是上面代码的返回值.这个的action就是对应activity的action,

上面的界面就是在fingerprint在执行skip后,进入face_unlock这个界面.face_unlock就是com.android.settings.suggested.FACEID_ENROLL这个action的界面.
如果需要不管返回结果,下个界面都要跳转到face_unlock就把

        <result wizard:name="skip"
            wizard:resultCode="1"
            wizard:action="face_unlock" />

替换

<result wizard:action="face_unlock" />

问题总结

(1)无法跳转到指定界面
确保你action是正确的,用adb验证一下,

(2)点击skip或完成操作后退回上一步
看Activity是否用finish结束了

(3)如果所使用的Activity是之前setting的界面,在结束的时候调用finish了
客户自己在写一个界面,然后startActivtyForResult调用指定界面,然后onActivityResult处理

发布了67 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/w1764662543/article/details/88402381
9.1