首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

androidx中已弃用的OnActivityResult()

OnActivityResult() 方法在 AndroidX 中已经被弃用,取而代之的是 registerForActivityResult() 方法。这个变化是为了简化 Activity 和 Fragment 之间的交互,并提高代码的可读性和可维护性。

基础概念

OnActivityResult() 是一个回调方法,用于处理从启动的 Activity 返回的结果。当从一个 Activity 启动另一个 Activity 并期望在该 Activity 完成后返回结果时,可以使用 OnActivityResult() 来接收这些结果。

相关优势

  1. 生命周期感知registerForActivityResult() 是生命周期感知的,这意味着它会在正确的时机自动处理结果,而不需要手动管理生命周期。
  2. 更简洁的代码:使用 registerForActivityResult() 可以减少样板代码,使代码更加简洁和易于理解。
  3. 更好的类型安全:通过使用泛型,registerForActivityResult() 提供了更好的类型安全性。

类型

registerForActivityResult() 返回一个 ActivityResultContract 对象,该对象定义了如何启动 Activity 并处理结果。常见的 ActivityResultContract 包括:

  • ActivityResultContracts.StartActivityForResult:用于一般的 Activity 结果。
  • ActivityResultContracts.TakePicturePreview:用于拍照并预览图片。
  • ActivityResultContracts.TakePicture:用于拍照并保存图片。
  • ActivityResultContracts.PickContact:用于选择联系人。

应用场景

  • 拍照和选择图片:用户可以从相册中选择图片或使用相机拍照。
  • 获取用户输入:例如,从另一个 Activity 获取用户填写的表单数据。
  • 选择文件:允许用户从设备中选择一个文件。

示例代码

以下是一个使用 registerForActivityResult() 的示例:

代码语言:txt
复制
class MainActivity : AppCompatActivity() {

    private val requestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
            if (isGranted) {
                // Permission is granted. Continue the action or workflow in your app.
            } else {
                // Explain to the user that the feature is unavailable because the
                // features requires a permission that the user has denied.
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val requestPermissionButton = findViewById<Button>(R.id.request_permission_button)
        requestPermissionButton.setOnClickListener {
            // Request camera permission
            requestPermissionLauncher.launch(Manifest.permission.CAMERA)
        }
    }
}

遇到的问题及解决方法

问题:为什么 OnActivityResult() 被弃用?

原因OnActivityResult() 存在一些问题,例如它不是生命周期感知的,容易导致内存泄漏和崩溃。此外,它的使用方式较为繁琐,需要手动管理请求码和处理结果。

解决方法:迁移到 registerForActivityResult()。以下是迁移步骤:

  1. 移除 OnActivityResult() 方法:从你的 Activity 或 Fragment 中移除 OnActivityResult() 方法。
  2. 注册结果回调:使用 registerForActivityResult() 注册一个新的结果回调。
  3. 启动 Activity 并获取结果:使用注册的结果回调启动 Activity 并处理返回的结果。

例如,将以下旧的 OnActivityResult() 代码迁移到新的方式:

代码语言:txt
复制
// 旧的 OnActivityResult() 方法
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val resultData = data?.getStringExtra("result_key")
        // 处理结果
    }
}

迁移到新的方式:

代码语言:txt
复制
// 新的 registerForActivityResult() 方法
private val resultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val data: Intent? = result.data
            val resultData = data?.getStringExtra("result_key")
            // 处理结果
        }
    }

// 启动 Activity 并获取结果
fun startAnotherActivityForResult() {
    val intent = Intent(this, AnotherActivity::class.java)
    resultLauncher.launch(intent)
}

通过这种方式,你可以更简洁、更安全地处理 Activity 结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

(译)openURL 在 iOS10中已弃用

而与之相关的方法 canOpenURL: 在iOS 9隐私控制里也禁止查询设备中已安装的App。...苹果在iOS 10 中已经弃用了openURL:这个旧方法,用openURL:options:completionHandler:来代替。...(Haley_Wong注:canOpenURL:是在iOS 3中添加的;打开外部链接一般都是用来调起别的App,比如调起打电话、邮件、QQ、微信、支付宝等) iOS 10 中的更新 苹果在UIKit相关的...翻译如下: 新的UIApplication 方法`openURL:options:completionHandler:` 会异步执行,并在主队列中调用这个指定的 `completion handler`...这个弃用的方法有一个要打开的URL 参数,并且返回一个表示成功或者失败的布尔值: // Objective-C - (BOOL)openURL:(NSURL*)url // Swift open func

2.7K10

使用Pluto 检测已弃用的 Kubernetes API

前言 Kubernetes版本不断迭代中,Kubernetes API 也一直在变化。随着这些更改的出现,API 的某些部分被弃用并最终被删除。...我们如何发现已弃用和即将删除的API版本资源呢?该问题的一个答案是查看官方弃用文档,并检查在即将到来的Kubernetes更新中将删除的API资源版本。...Kubernetes API弃用的原因 Kubernetes指定了一个弃用策略,它定义了如果API的某些部分被弃用意味着什么?...https://fairwinds.com/insights-signup/pluto 说明:我们的目录中有两个文件已弃用 apiVersions。这需要在 1.16 升级之前修复。...该版本在 1.16 中已弃用 如果您想查看单个命名空间的信息,可以传递 --namespace 或 -n 标志来限制输出。

28530
  • Kubernetes 1.26 中的删除、弃用和主要更改

    已弃用的 API 已被标记为在未来的 Kubernetes 版本中删除;它将继续运行直到被删除(从弃用起至少一年),但使用会导致显示警告。...已删除的 API 在当前版本中不再可用,此时您必须迁移到使用替换 API。 一般可用 (GA) 或稳定的 API 版本可能会标记为已弃用,但不得在 Kubernetes 的主要版本中删除。...Kubernetes v1.26 中的弃用和删除 除上述内容外,Kubernetes v1.26 的目标是包括一些额外的删除和弃用。...作为其中的一部分,Kubernetes v1.26 将删除已弃用的 OpenStack (cinder卷类型)树内存储集成。.../github.com/kubernetes/enhancements/issues/1489 删除 GlusterFS in-tree 驱动程序 树内 GlusterFS 驱动程序 在 v1.25 中已弃用

    1.8K30

    学习Android时发现别人已写的方法已被弃用怎么办

    问题描述 在学习Android时我们肯定要敲别人的代码,而过去时间写的代码在高API版本中很容易遇到已被启动的情况,下面就是这种情况的例子: ? 但是我们如何才能找到这个方法的更新版本呢?...首先我们打开Google的Android官方网站:Android Developers,如下所示: ? 然后在搜索栏中搜索。...但是注意我们不要直接搜索方法名,就如此例中的:getDrawable()方法,因为并不会提供任何结果,而是应当搜索此方法所属的类,而类我们通过Android Studio就可以查询到了: ?...在跳出页面中再点击红色区域: ? 如下: ?...我们发现现在的此方法需要输入Theme,但是可以选择输入nulll,我们就简单一点,修改原来的方法,多输入一个参数null,如下: ? 可以看到现在所示的方法就不在提示方法被弃用了。

    1.9K10

    Thread类弃用的方法

    Thread 类除了有一些有用的方法之外,还有一些危险的方法,开发者不应该使用。这些方法是 Java 线程 API 原来提供的,但很快就发现不适合开发者使用。...可惜的是,因为 Java 要向后兼容,所以不能把这些方法从 API 中移除。开发者要知道有这些方法,而且在任何情况下都不能使用。...stop() 如若不违背并发安全的要求,几乎不可能正确使用 Thread.stop(),因为 stop() 方法会立即“杀死”线程,不会给线程任何机会把对象恢复成合法状态。...其实,这种机制会导致死锁之间的条件竞争,而且 resume() 会导致这几个方法不能使用。 destroy() 这个方法一直没有实现,如果实现了,会遇到与 suspend() 方法一样的条件竞争。...开发者始终应该避免使用这些弃用的方法。为了达到上述方法的预期作用,Java 开发了一 些安全的替代模式。前面提到的“关闭前一直运行”模式就是这些模式的一例。

    69310

    startActivityForResult被标记为弃用后,如何优雅的启动Activity?

    大家好,又见面了,我是你们的朋友全栈君。 文章目录 一、如何解决 startActivityForResult 被弃用? 二、ActivityResultContract 该如何使用?...一、如何解决 startActivityForResult 被弃用?...可以明显的看到,在androidx.activity1.2.0-alpha04时开始,Android中这位你调用过无数次的startActivityForResult和onActivityResult,...弃用原因也许是onActivityResult里需要处理的各种判断、嵌套,也许是既要处理requestCode也要处理resultCode这种高耦合难以维护的Id判断模式。...但其原因已不重要了,因为既然Android里已提供了更好的方案并把startActivityForResult标记为了弃用,那么我们就应该开始了解一下位于 ComponentActivity 或 Fragment

    3.2K20

    Table被web编程弃用的原因

    Table要比其它html标记占更多的字节。 (延迟下载时间,占用服务器更多的流量资源。) Tablle会阻挡浏览器渲染引擎的渲染顺序。 (会延迟页面的生成速度,让用户等待更久的时间。)...Table里显示图片时需要你把单个、有逻辑性的图片切成多个图。 (增加设计的复杂度,增加页面加载时间,增加HTTP会话数。) 在某些浏览器中Table里的文字的拷贝会出现问题。...Table会影响其内部的某些布局属性的生效(比如里的元素的height:100%) (这会限制你页面设计的自由性。) 一旦学了CSS知识,你会发现使用table做页面布局会变得更麻烦。...(先花时间学一些CSS知识,会省去你以后大量的时间。) table对对于页面布局来说,从语义上看是不正确的。 (它描述的是表现,而不是内容。) table代码会让阅读者抓狂。...Tables的好处 在某些场合,使用Table是100%的适合、恰当和正确。比如,用table做表格是完全正确的。 如果你无法判断是否应该使用table,参考一下上面的几条,相信你能找到答案。

    98470

    Twitter的野心:我们终将弃用密码

    这个过程也很简单:用户在应用程序的登录页面输入自己的手机号码,然后twitter用某一次性代码给这个手机号码发个验证码。你一旦进入正确的验证码,就可以像往常一样打开twitter应用程序了。...在不久的将来,Twitter用户就可以用Digits登录Apps了,登录过程有三个步骤: 1、在移动设备的登录页面有一个注册的选项,页面上输入你的电话号码; 2、接着Twitter会发送一条短信,你输入其中的验证码...为什么作出这种弃用密码、登陆APP的选择呢?思考缘由,是因为考虑到发展中国家电子邮件并不常用。同时开发这一功能还有一个好处就是解决了人们要记住多个web网站密码的痛苦。...FreeBuf观点 在数据库泄露频发的今天,不知国内厂商是否有过类似想法,或正在潜心研究替代密码的新技术呢?如果弃用密码并找到了可以替代密码的新技术,那绝对是一项伟大的革新!...在之前的文章中我们已经介绍过虹膜扫描的生物验证方法,也介绍过一个用特定URL取代密码的技巧。 事实也证明,取代密码,人们一直在努力!

    1.1K50

    java中的onresume_java – onActivityResult()之前调用onResume()?

    大家好,又见面了,我是你们的朋友全栈君。...这里是我的应用程序布局: > onResume()提示用户登录 >如果用户登录,他可以继续使用该应用程序 3.如果用户在任何时候退出,我想再次提示登录 我该如何实现呢?...System.out.println(e); } catch (NullPointerException e) { System.out.println(e); } } } 用户成功登录后: protected void onActivityResult...,Toast.LENGTH_SHORT).show(); } } 问题是,onResume()在onActivityResult()之前被调用,所以当用户成功登录时,我的主活动不会得到通知,因为首先调用...在哪里是提示登录的最佳地点? 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144082.html原文链接:https://javaforall.cn

    27910

    微软将在Windows中弃用VBScript,组态软件大军的VBS脚本该何去何从?

    JZGKCHINA 工控技术分享平台 微软宣布弃用 VBScript并计划在未来的 Windows 版本中逐步淘汰该脚本语言。“VBScript 在从操作系统中移除之前,将作为按需功能提供。”...VBScript可以看作是 VB 语言的简化版,它具有VB语言容易学习的特性。...VBS天生集成到 Windows 环境中,并通过VBS脚本与主机应用和组件程序通信。 尽管微软官方并未对此做出任何解释。 笔者猜测 弃用 VBScript 的的部分原因可能是出于安全考虑。...可能现在还在工控组态软件领域存活的就只剩下VBA这一支血脉了,相信不久的将来随着office内嵌python的流行,VBA也会完成它的使命而退出舞台,而那个时候相信更多的组态软件以VBA为脚本的家族也已经改到其他编程语言引擎的轨道上来了...,比如IFIX的VBA脚本,FacrotyTalk ViewSE的VBA脚本,Citect悉亚特的VBA脚本等等吧。。。。

    48060
    领券