Android 新增API Autofill

Autofill framework
顾名思义:
当用户交互触发自动填充请求时,Android系统会在客户端应用程序中创建屏幕的分层表示(称为view结构)。view结构包含可在每个节点中使用的自动填充类型以及节点的当前值等信息。Android系统将view结构添加到自动填充请求,并将其发送到尝试完成请求的自动填充服务。自动填充框架定义了用于保存用户数据的工作流程; 如果视图结构准确描述了客户端应用程序中的屏幕,则自动填充服务可以更好地满足请求。此外,您可以提供专门创建的其他信息,以帮助自动填充服务确定如何完成请求
一、
什么是Autofill Framework
1.它是一个服务端和客户端协同工作的基础结构,自动填写框架主要针对与某些应用的用户数据自动填写view,和管理应用之间的一种通信机制;
2.在了解这两个类之前先看一下关于自动填充的一些相关信息,自动填写框架必须是在(API 26)也就是android8.0以后版本及更高版本才可以使用;
3. 便于用户在使用登录多个账户,或登录密码,邮箱,验证码等,减少用户使用过程中重新输入信息和错别字的修改;
4.用户可以自行选择多种自动填写服务(过程类似于选择输入法)。默认情况下,Google服务支持自动填写,不过用户可以自行添加任何三方自动填写app,操作方法如下:
Setting->system->languages&input->advanced->autofill services

Autofill services:服务端,用来保存和存储多个应用程序使用中的用户信息。
Autofill clients:客户端,指应用程序需要填写和保存用户数据的信息;
Android system:系统,主要是指如何使用AutofillService和AutofillManager与Clients协同工作的操作系统;
有关自动填充的更多信息,详情可参考链接:
https://developer.android.com/guide/topics/text/autofill

二、如何构建autiofill service
1.首先是要清单文件声明权限,“android.permission.BIND_AUTOFILL_SERVICE”,在res文件定义xml包, 生成一个service_configuration.xml资源用来指定用户允许用户配置service的Activity;

AndroidManifest.xm

<service
   android:name=".MyAutofillService"
    android:label="My Autofill Service"
    android:permission="android.permission.BIND_AUTOFILL_SERVICE">
    <intent-filter>
 <action        
       android:name="android.service.autofill.AutofillService" />
    </intent-filter>
    <meta-data
        android:name="android.autofill"
        android:resource="@xml/service_configuration" />
</service>

service_configuration.xml

<autofill-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.example.android.SettingsActivity" />

2.这里要注意的是"android.service.autofill.AutofillService"这个action,在AutofillService中onBind方法中有一个判断,如过action匹配则将通信通道返回给服务 ,反之客户端将无法绑定到服务,如图1,下滑线的server apk则不会出现;

public static final String SERVICE_INTERFACE ="android.service.autofill.AutofillService";
...
@Override
public final IBinder onBind(Intent intent) {
if (SERVICE_INTERFACE.equals(intent.getAction())) {
        return mInterface.asBinder();
    }
    Log.w(TAG, "Tried to bind to wrong intent: " + intent);
    return null;
}

图 1;
在这里插入图片描述

3.在用户启用BIND_AUTOFILL_SERVICE权限后,可以通过AutofillManager调hasEnabledAutofillServices()方法来进行验证,是否启动当前服务,如果没有启动可通过intent发生一个ACTION_REQUEST_SET_AUTOFILL_SERVICE启动setting中autofill的Activity来选择更改自动填充服务如图2,如调用者和包匹配,intent则会返回一个值;

public class MainActivity extends Activity {
@Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
       ...
     //通过SystemService获取AutofillManager;
  mAutofillManager = getSystemService(AutofillManager.class);
     ...
     }
 public void startSettingAutofillActivity(){
     if (mAutofillManager != null && !mAutofillManager.hasEnabledAutofillServices()) {
      //通过此参数可直接打开settingActivity自动填充页面;
      Intent intent = new Intent(Settings.ACTION_REQUEST_SET_AUTOFILL_SERVICE);
      intent.setData(Uri.parse("package:com.example.android.autofill.service"));
      startActivityForResult(intent, 1);
       } else {
      //如果应用调用此API的,已启用自动填充服务将被禁用。
     mAutofillManager.disableAutofillServices();
      }
   }
}

图2:
在这里插入图片描述

4.自定义Autofillservice,需要重新两个方法onFillRequest()和onSaveRequest(),这两个方法是AutofillService中的回调方法,在什么事后回调, onFillRequest()点击自动填充执行填充时,切当前用户没有记录时调用该方法; onSaveRequest()请求服务保存内容时调用该方法;

public class MyAutofillService extends AutofillService{
    @Override
    public void onFillRequest(@NonNull FillRequest request, @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback) {
    }
    @Override
    public void onSaveRequest(@NonNull SaveRequest request, @NonNull SaveCallback callback) {
    }
    
}

5.在输入用户名或密码点击登录或finish当前Activity时,acitvity处于onStop状态时,此时会调起onActivityFinishing最终调起showSaveUi,并创建SaveUi对象,其SaveUI内部就是创建了一个Dialog,在显示dialog的执行过程中,会把自动填充的数据采用ArrayMap<Id,value>进行封装,最后通过onSave()方法对其进行保存,如图3;

图3:
在这里插入图片描述

如何构建autofill service https://blog.csdn.net/xiao_yuanjl/article/details/85098706

关于AutofillService和AutofillManager详细使用,可先看如下两个链接,不过需要翻墙才可以:
https://developer.android.com/reference/android/service/autofill/AutofillService
https://developer.android.com/reference/android/view/autofill/AutofillManager#public-methods

猜你喜欢

转载自blog.csdn.net/xiao_yuanjl/article/details/84995091