返回

通俗易懂:在Android中巧用startActivityForResult方法,轻松处理回调和Activity回收

Android

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被回收后如何处理回调的方法。希望本文对您有所帮助。