当前位置: 首页 > news >正文

塔城地区建设工程信息网站江苏国税网站电子申报怎么做

塔城地区建设工程信息网站,江苏国税网站电子申报怎么做,网站备案号有效期,做网站第一步文章目录 onActivityResult 存在的问题registerForActivityResult 有哪些改进registerForActivityResult 实战registerForActivityResult 自定义使用registerForActivityResult 开箱即用StartActivityForResultGetContent 后记注意事项附录 安卓的兼容性是出了名的低#xff0… 文章目录 onActivityResult 存在的问题registerForActivityResult 有哪些改进registerForActivityResult 实战registerForActivityResult 自定义使用registerForActivityResult 开箱即用StartActivityForResultGetContent 后记注意事项附录 安卓的兼容性是出了名的低原因就在于它经常喜欢出一个版本就换一个 API。终于连 Activity 之间数据回传的方法 onActivityResult 也废弃了。安卓官方给出的解决方案是使用 registerForActivityResult 来代替 onActivityResult。 registerForActivityResult 的使用流程比原先的 onActivityResult 要复杂很多但理解了之后发现这种新的方式确实更优雅。 为了能让读者理解这里先回顾原来 onActivityResult 的使用方式然后再来对比讲解 registerForActivityResult。 onActivityResult 存在的问题 为了便于说明这里假设 活动 A 调用了 活动 B然后活动 B 生命结束将结果回传至活动 A。 在这个过程中A 需要在调用时向 B 传递一个 请求码这样在 B 返回时就会自动携带那个请求码。同时 B 需要提供一个 返回码来代表 B 中返回的具体数据 Intent 作一个分类。 活动 A Intent intent new Intent(AActivity.this, BActivity.class); startActivityForResult(intent, requestCode);Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode SOME_REQUEST_CODE resultCode Activity.RESULT_OK) {if (data ! null) {String value data.getStringExtra(key);// 在这里处理传递过来的信息}} }活动 B Intent resultIntent new Intent(); resultIntent.putExtra(key, value); setResult(Activity.RESULT_OK, resultIntent);可以看出在这个过程中请求码 才是必要的参数因为活动 A 有可能在不同情况下启动不同的活动所以需要标记究竟是哪个活动返回到 A 的。而 返回码 只是一种安卓额外提供的对回传数据的分类这个参数实际上不是必要的因为回传数据内部自己就可以自行分类。另外此值固定设置为 int 类型也非常不合理。 不仅如此onActivityResult 直接作为 Activity 的重载方法耦合度过大。onActivityResult 会直接接管所有活动的回传业务这是非常不合适的。正确的设计方案应该是让每一个返回至活动 A 的活动单独在一个方法中处理回传业务这样不同的活动之间就可以非侵入解耦而不是将它们集中在一起统一管理。 可以看出onActivityResult 的设计其实确实是有很多问题的只不过这个 API 过于古老所以广泛用了很久。 registerForActivityResult 有哪些改进 没有任何开发者喜欢官方一出一个新版本就照官方的指示更换一次 API。这是没有技术含量的事情。如果一个新设计没有重大突破它也没有替代老古董的必要。registerForActivityResult 相比于 onActivityResult 做了很多设计上的改进。尽管使用流程变得更复杂但实际上好用很多。 registerForActivityResult 使用了 责任链模式。责任链模式在很多通信框架中都有广泛使用如 Netty 等。安卓 Activity 的回传过程如果有更复杂的业务需求其中就涉及对数据的编码与解码。registerForActivityResult 就支持对回传数据的解码及解码之后的业务处理。这一点它和 onActivityResult 不同onActivityResult 是把返回码写死为 int 类型而 registerForActivityResult 虽然也是把返回码写死为 int 类型但它由于提供了一个 编解码器因此支持将回传数据转化为任意的类型。 此外registerForActivityResult 会直接与要启动的 Activity 相绑定这意味着对 registerForActivityResult 来说它不需要提供 请求码 来标记不同的 Activity。因为 registerForActivityResult 并不是 Activtity 重载方法它支持多实例因此可以让不同活动的回调代码相互隔离而不是像 onActivityResult 集中在一起统一管理。 registerForActivityResult 实战 纸上得来终觉浅没有实战的讲解没有任何意义。这里结合具体代码来详细介绍 registerForActivityResult 的使用。 registerForActivityResult 自定义使用 registerForActivityResult 是 Activtity 的一个方法它可以生成一个 ActivityResultLauncherIntent 对象该对象的 launch 方法可以启动一次 Activtity 调用流程。该对象可以启动一个 Activtity 并与之绑定这样将这个启动的 Activtity 回传时接收回传数据的代码就无需使用 请求码 了。 可以向 launch 提供一个实参来表示本次 Activtity 调用流程的输入。这个输入可以是任意类型也可以为 null。 // 这里的 this 指向的是一个 Activity ActivityResultLauncherIntent activityLauncher this.registerForActivityResult(...); activityLauncher.launch(input);然后当需要接收处理回传数据时可以在 registerForActivityResult(...) 中提供回调来处理。 其中registerForActivityResult 接受两个参数第一个就是笔者前面提到的 编解码器第二个就是解码之后的业务处理。 但是contract 在英语的意思并不是解码与解码。虽然这里就实际使用来说意译成 编解码器 会更加望文生义一些但直译成 协议 可能更符合翻译界的 信达雅 规则。因此本文后面将使用 协议 一词但实际上这里的 contract 是一种 编解码器。 NonNull Override public final I, O ActivityResultLauncherI registerForActivityResult(NonNull ActivityResultContractI, O contract,NonNull ActivityResultCallbackO callback) {return registerForActivityResult(contract, mActivityResultRegistry, callback); }可以看出上面的形参 contract 就是 协议它有两个泛型形参第一个代表输入第二个代表输出。输入就是前面向 launch 方法提供的输入。而输出则会向形参 callback 传递。 而形参 callback 就是解码之后的业务处理它有一个泛型形参代表从 contract 解码之后的可操作数据。 自定义一个 协议 ActivityResultContractI, O它有两个抽象方法其中方法 createIntent 会在启动一个新 Activity 之前被调用它代表对输入数据的编码。因此它的返回值被固定为 Intent代表需要启动的 Activity。 方法 parseResult 则会在启动的那个 Activity 结束返回到原 Activity 时调用它代表对输出数据的解码。因此它也有一个为 Intent 类型的形参。而另一个形参 resultCode则是启动的那个 Activity 在结束前设置的这一点与原先使用 onActivityResult 时是一样的。 可以看出整个过程不需要 请求码因为 ActivityResultLauncher 已经与启动的 Activity 进行了绑定所以无需使用 请求码 将不同的 Activity 分开。 abstract class ActivityResultContractI, O {abstract fun createIntent(context: Context, input: I): Intentabstract fun parseResult(resultCode: Int, intent: Intent?): O// ...省略其它内容... }下面假设前面向 launch 方法提供的输入为 Integer 类型而输出设置为 String 类型。这里先用方法 createIntent 启动了一个新 Activity然后在方法 parseResult 中对回传数据进行解码处理。 import android.content.Context; import android.content.Intent;import androidx.activity.result.contract.ActivityResultContract;public class ActivityResultHandler extends ActivityResultContractInteger, String {NonNullOverridepublic Intent createIntent(Context context, Integer input) {// 设置要启动的 ActivityIntent intent new Intent(context, BActivity.class);intent.putExtra(INPUT_VALUE, input);return intent;}NonNullOverridepublic String parseResult(int resultCode, Intent intent) {// 处理回传数据解码业务if (resultCode RESULT_OK intent ! null) {return intent.getStringExtra(MESSAGE);}return null;} }自定义解码之后的业务处理。它有一个名称看起来很熟悉的方法 onActivityResult它的形参正是上面 协议 中输出的内容。 public interface ActivityResultCallbackO {void onActivityResult(SuppressLint(UnknownNullness) O result); }这样被启动的那个 Activity 就可以使用 setResult 传递回传数据了。这个步骤与原先使用 onActivityResult 时是一样的。 Intent data new Intent(); data.putExtra(MESSAGE, ...回传数据...); setResult(RESULT_OK, data); finish();上面的代码也可以组合起来成一次函数调用。 this.registerForActivityResult(new ActivityResultContractInteger, String() {NonNullOverridepublic Intent createIntent(Context context, Integer input) {// 设置要启动的 ActivityIntent intent new Intent(context, BActivity.class);intent.putExtra(INPUT_VALUE, input);return intent;}NonNullOverridepublic String parseResult(int resultCode, Intent intent) {// 处理回传数据解码业务if (resultCode RESULT_OK intent ! null) {return intent.getStringExtra(MESSAGE);}return null;}},result - {// 处理回传数据业务}).launch(0); // 传入输入参数 input 值registerForActivityResult 开箱即用 虽然上面的流程对于笔者这种技术栈较广的老将来说理解起来不是很有难度但对有些新手来说却有点不太友好。为此安卓官方在 ActivityResultContracts 下提供了一些开箱即用的 协议它使得 registerForActivityResult 用起来就像原先的 onActivityResult 一样。 StartActivityForResult StartActivityForResult 是最普通的 协议它使得 registerForActivityResult 用起来就像原先的 onActivityResult 一样。 ActivityResultLauncherIntent activityLauncher this.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result - {// 处理回传数据业务}); Intent intent new Intent(AActivity.this, BActivity.class); activityLauncher.launch(intent);GetContent GetContent 可以用于与安卓系统自带应用之间的交互。例如下面的代码演示了打开系统相册并选择图片的方法。 ActivityResultLauncherIntent activityLauncher this.registerForActivityResult(new ActivityResultContracts.GetContent(),uri - {// 处理图片回传}); activityLauncher.launch(image/*);后记 注意事项 当 Activity 返回时registerForActivityResult 的回调 callback 会先于 Activity 的方法 onResume 被调用。这与原先被废弃的 onActivityResult 是一样的。 registerForActivityResult 需要在生命周期方法 onCreate 及之前调用。也就是说registerForActivityResult 方法只能在类字段和 onCreate 方法中使用。不能随意调用 registerForActivityResult 来设置 Activity 在返回之后的行为否则会导致如下报错。 java.lang.IllegalStateException: LifecycleOwner XXX is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:833)at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:842)附录 安卓官方 registerForActivityResult 使用说明https://developer.android.google.cn/training/basics/intents/result?hlzh-cn
http://www.zqtcl.cn/news/686068/

相关文章:

  • 具体的网站建设方案网页程序开发采购
  • 泉州 网站建设苏州网站外包
  • 网站做404页面怎么做网站开发过程的基本环节
  • 做网站是前端还是后端小程序网站模板
  • 学校网站建设与维护建设银行官网电话
  • dedecms网站地图修改软件开发公司规章制度
  • 大型旅游网站骏驰网站开发
  • 有心学做网站两学一做知识竞赛试题网站
  • 西宁圆井模板我自己做的网站怎么做网站能快速赚钱
  • 根据网站集约化建设的要求直流分公司四川建设部网站
  • 网站优化平台有哪些遵义网站开发的公司有哪些
  • 推荐一下网站谢谢微盟微商城怎么样
  • 网站建设的技术指标网站做好第二年要多少钱
  • 工业设计东莞网站建设WordPress网络功能
  • 网站pv多少可以企业网站托管常见问题
  • 深圳有哪些网站建设沈阳做机床的公司网站
  • 2022年网站能用的wordpress 客户端使用
  • 社交网站建设内容如何制作橡皮泥 简单
  • 简述网站的制作流程wordpress定制分类
  • 如何自建购物网站wordpress文章编辑插件
  • 网站策划机构建筑网站、
  • 邹平做网站的公司标志设计图片大全简单
  • 广东省建设厅官方网站多少钱如何在虚拟机里面做网站
  • 上海免费网站建设模板做网站页面的软件
  • 做折页的网站个人网站有哪些
  • 服装网站建设内容wordpress媒体库只能列表
  • 北京好的做网站的公司东莞专业做淘宝网站
  • 网站结构怎么优化wordpress文章列表添加字段
  • 网站建设框架图长沙官网seo技术厂家
  • 电子商务网站建设主管的策划案html个人网站设计模板