通俗易懂:在Android中巧用startActivityForResult方法,轻松处理回调和Activity回收
2024-02-08 14:00:30
1. 回调形式使用startActivityForResult方法
startActivityForResult方法的基本使用方式是:
startActivityForResult(intent, requestCode)
其中,intent是要启动的Activity的Intent对象,requestCode是一个请求码,用于标识此次startActivityForResult的调用。
当被启动的Activity结束后,它可以通过setResult方法设置返回结果,然后调用finish方法结束自身。
在启动的Activity中,可以通过onActivityResult方法来接收返回结果。onActivityResult方法的签名如下:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
其中,requestCode是startActivityForResult方法中传入的请求码,resultCode是被启动的Activity通过setResult方法设置的返回结果,data是是被启动的Activity通过setResult方法设置的返回数据。
使用回调形式使用startActivityForResult方法的示例代码如下:
// 在Activity中定义一个回调接口
interface OnActivityResultListener {
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
}
// 在Activity中声明一个回调接口的成员变量
private var onActivityResultListener: OnActivityResultListener? = null
// 在Activity中设置回调接口
fun setOnActivityResultListener(listener: OnActivityResultListener) {
onActivityResultListener = listener
}
// 在Activity中调用startActivityForResult方法
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
onActivityResultListener?.onActivityResult(requestCode, resultCode, data)
}
这样,当被启动的Activity结束后,onActivityResult方法就会被调用,然后将返回结果和数据通过回调接口传递给注册了回调接口的Activity。
2. 解决Activity被回收后如何处理回调的问题
在某些情况下,Activity可能会在onActivityResult方法被调用之前被回收。例如,如果用户按下了返回键或者系统由于内存不足而杀死了Activity。
为了解决这个问题,我们可以使用SavedInstanceState对象来保存返回结果和数据。在Activity的onSaveInstanceState方法中,将返回结果和数据保存在SavedInstanceState对象中:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("requestCode", requestCode)
outState.putInt("resultCode", resultCode)
outState.putParcelable("data", data)
}
在Activity的onCreate方法中,检查SavedInstanceState对象中是否有返回结果和数据,如果有,则将它们传递给onActivityResult方法:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState != null) {
val requestCode = savedInstanceState.getInt("requestCode")
val resultCode = savedInstanceState.getInt("resultCode")
val data = savedInstanceState.getParcelable<Intent>("data")
onActivityResult(requestCode, resultCode, data)
}
}
这样,即使Activity被回收,返回结果和数据也不会丢失,仍然可以传递给onActivityResult方法。
3. 结语
以上就是以回调形式使用startActivityForResult方法以及解决Activity被回收后如何处理回调的方法。希望本文对您有所帮助。