42

[译]AndroidX中Activity Result APIs初探 - 简书

 4 years ago
source link: https://www.jianshu.com/p/aa57787d18ca?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
0.1682020.03.25 01:16:59字数 722阅读 444

原文 A first look at AndroidX Activity Result APIs

几周前,我发表了一篇关于 AndroidX如何改变我们处理Activity和Fragment的方式 的文章,现在就来看看 AndroidX 中新引入的 Activity Result API,该 API 增加来处理 Activity 结果请求的功能,类似于我们用 SaveStateRegistry 或用 OnBackPressedDispatcher。
    Android Result APIs 从 AndroidX Activity 1.2.0-alpha02 和 Fragment 1.3.0-alpha02 开始引入的。你可以使用-ktx 扩展库来使用 Kotlin 开发更简洁的代码。

自定义 Contract 数据

如果我们想要和其他的Activity交互,并且通过获取到返回的数据,通过到做法是用startActivityForResult 调用其他到Activity并且重写onActivityResult获取到返回到数据,在onActivityResult 方法需要判断返回到数据类型,因为如果你调用多个Activity返回到数据都是在这个方法中,你必须保证你启用的是正确的 Activity 并且在结束的是获取输出结果。这就是抽象类ActivityResultContract<I, O>包含两个抽象方法的原因

public abstract class ActivityResultContract<I, O> {

    /** Create an intent that can be used for {@link Activity#startActivityForResult} */
    public abstract @NonNull Intent createIntent(@SuppressLint("UnknownNullness") I input);

    /** Convert result obtained from {@link Activity#onActivityResult} to O */
    public abstract @SuppressLint("UnknownNullness") O parseResult(
            int resultCode,
            @Nullable Intent intent);
}

继承ActivityResultContract类重写两个方法,定义个int类型的输入参数,一个String类型的返回数据

public class MyContract extends ActivityResultContract<Integer,String> {
    private String ACTION = "com.myapp.action.MY_ACTION";//指定Action
    private String INPUT_INT = "input_int";//
    private String OUTPUT_STRING = "output_string";
    private Context context;
    
    @NonNull
    @Override
    public Intent createIntent(Integer input) {
        //创建一个Intent 可以给startActivityForResult使用
        return new Intent(ACTION).putExtra(INPUT_INT,input);
    }

    @Override
    public String parseResult(int resultCode, @Nullable Intent intent) {
        //将从onActivityResult方法中获取的返回结果进行判断和转换成指定的对象类型
        String data = null;
        if (resultCode == Activity.RESULT_OK) {
            data=intent.getStringExtra(OUTPUT_STRING);
        }
        return data;
    }
}

库中预编译好的Contract类型

  • Dial:通过ACTION_DIAL发送一个tel:{number}格式的数据调用拨打电话,并返回数据结果状态(布尔值)
  • TakePicture:使用Intent with ACTION_IMAGE_CAPTURE调用图像选择功能并返回位图对象,
  • RequestPermission:对于请求单个运行时权限,返回一个布尔值,指示是否已授予权限,
  • RequestPermissions:对于请求多个运行时权限,返回布尔值映射,指示是否授予了权限,
  • StartActivityForResult:一个原始契约,它接受一个意图作为输入,并返回一个包含resultCode和从请求的活动返回的意图的结构。
    如您所见,Activity Result APIs可用于处理对运行时权限的请求,因此您无需为此使用单独的API。

在你的Activity中使用prepareCall 方法将你自定的ActivityResultContract类的对象传入,并传入一个ActivityResultCallback对象,用于处理获取到的已经转换成特定数据类型的结果

  prepareCall(new MyContract(), new ActivityResultCallback<String>() {
            @Override
            public void onActivityResult(String result) {
            //处理获取到的已经转换成特定数据类型的结果
            }
        });

prepareCall方法可以选择采用的实例ActivityResultRegistry。在测试中,您可以提供伪造的注册表实现,例如,分派模拟结果。官方文档中提供了一些示例。

Activity Result APIs现在可在Alpha AndroidX alpha版本中使用,因此在达到稳定状态之前可能会引入许多更改。但是,很高兴知道正在准备对以前的API进行如此重大的改进,并将在未来几个月内投入生产!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK