Android活动返回不在再支持startActivityForResult()后的处理方法

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。Android活动返回不在再支持startActivityForResult()后的处理方法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

实现活动之间的交互,并返回上个活动,传统的方法是利用startActivityForResult启动活动,并在onActivityResult函数中处理返回上一个活动的数据及其他的处理。具体代码的做法如下:

class MainActivity : AppCompatActivity() {
   lateinit var binding:ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         binding = ActivityMainBinding.inflate(layoutInflater)
         setContentView(binding.root)
        binding.firstBtn.setOnClickListener {
            turnTo(FirstActivity::class.java,1)       			//跳转到FirstActivity活动
        }
       binding.secondBtn.setOnClickListener {
            turnTo(SecondActivity::class.java,2)     			//跳转到SecondActivity活动
        }
    }
private fun <T> turnTo(c:Class<T>,requestCode:Int){
        val intent = Intent(MainActivity@this,c) 	   		//定义意图
        startActivityForResult(intent,requestCode)   		//启动活动,设置请求码
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode== Activity.RESULT_OK){
            when(requestCode){
                1->{	                                                                //从FirstActivity返回
                    val receivedData = data?.getStringExtra("info")
                    Toast.makeText(MainActivity@this,"接收:$receivedData",
                                  Toast.LENGTH_LONG).show()
                }
                2->{                                                                      //从SecondActivity返回
                    Toast.makeText(MainActivity@this, resources.getString(R.string.title_frm_second),
                                   Toast.LENGTH_LONG).show()
                }
            }
        }
    }
}

但是,appcompat库升级到1.3.0或更高的版本,中这种处理方式已经不支持使用了。原因是官方建议使用Activity Result API. 在新的版本下,活动之间交互,并同时需要返回上一个活动,这时代码调整为:
在上一个活动中,代码类似:

class MainActivity : AppCompatActivity() {
    lateinit var resultLauncher: ActivityResultLauncher<Intent>
    lateinit var binding:ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        resultLauncher =registerForActivityResult(
            ActivityResultContracts.StartActivityForResult(),
                ActivityResultCallback {
                    if(it.resultCode== Activity.RESULT_OK){
                         Toast.makeText(MainActivity@this, 
                                    it.data?.getStringExtra("FrmInfo"),
                                   Toast.LENGTH_LONG).show()
                    }
             })
          binding.firstBtn.setOnClickListener {
            turnActivity(FirstActivity::class.java,"To FirstActivity")      			
            //跳转到FirstActivity活动
        }
       binding.secondBtn.setOnClickListener {
            turnTo(SecondActivity::class.java,"To SecondActivity")     			
            //跳转到SecondActivity活动
        }   
    }
    private fun<T> turnActivity(c:Class<T>,info:String){
        //跳转到下一个活动
        val intent = Intent(this,c)
         intent.putExtra("DATA",info)
        resultLauncher.launch(intent)**
    }
}

registerForActivityResult()活动结果注册回调函数接收两个参数:
(1)第一个参数:是Contract类型,定义生成结果所需的输入类型以及结果的输出类型。这些 API 可为拍照和请求权限等基本 intent 操作提供默认协定。它的作用在于从另外一个Activity中请求数据;
(2)第二个参数:是ActivityResultCallback,是单一方法接口,带有 onActivityResult() 方法,可接受 ActivityResultContract 中定义的输出类型的对象,表示成一个Lambda表达式,当有结果返回时则会回调到这里,在此处获取并处理数据。

在跳转的活动中,代码类似:

class FirstActivity : AppCompatActivity() {
    lateinit var binding:ActivityFirstBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
      
        binding = ActivityFirstBinding.inflate(layoutInflater)
        //接收从MainActivity发送的数据
        binding.firstTxt.text = intent.getStringExtra("DATA")
        binding.returnBtn.setOnClickListener {
            //返回上一个活动MainActivity
            val intent = Intent()
            intent.putExtra("FrmInfo","FirstActivity返回MainActivity")

            setResult(Activity.RESULT_OK,intent)
            finish()
        }
        setContentView(binding.root)
    }
}

参考文献:

“获取 activity 的结果”
https://developer.android.google.cn/training/basics/intents/result?hl=zh-cn

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195563.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!