• Android笔记(五):结合Compose组件利用ActivityResultLauncher解决多活动跳转返回数据


    在本人博客中Android活动返回不在再支持startActivityForResult()后的处理方法已经记录采用ActivityResultLauncher来处理多活动的返回并传回数据的方式。但是采用的是布局xml+viewBinding技术。目前,谷歌官方推荐使用JetPack Compose组件来定义界面。在本文中,将介绍在JetPack Compose定义的界面中ActivityResultLauncher的实现不同活动跳转并返回数据。
    例:从MainActivity跳转到OtherActivity,并从OtherActivity返回。运行界面类似:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    一、定义MainActivity

    在主活动中定义ActivityResultLauncher来处理从其他活动返回的处理。

    val resultLauncher:ActivityResultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult(),
    ActivityResultCallback {
    if(it.resultCode== Activity.RESULT_OK){
    val returnData = it.data?.getStringExtra(“returnData”)
    Toast.makeText(this,returnData,Toast.LENGTH_LONG).show()
    }
    })

    具体代码如下:

    class MainActivity : ComponentActivity() {
        private lateinit var resultLauncher: ActivityResultLauncher<Intent>
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            //注册活动结果,处理从其他活动返回的动作
            resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult(),
                ActivityResultCallback {
                    if(it.resultCode== Activity.RESULT_OK){
                        val returnData = it.data?.getStringExtra("returnData")
                        Toast.makeText(this,returnData,Toast.LENGTH_LONG).show()
                    }
                })
            setContent {
                ForCourseTheme {
                    Surface(
                        modifier = Modifier.fillMaxSize(),
                        color = MaterialTheme.colorScheme.background
                    ) {
                        JumpOtherScreen(resultLauncher)
                    }
                }
            }
        }
    }
    
    @Composable
    fun JumpOtherScreen(resultLauncher: ActivityResultLauncher<Intent>) {
        val context = LocalContext.current
    
        Box(modifier = Modifier.fillMaxSize().background(Color.Green),
            contentAlignment = Alignment.Center){
            Button(onClick={
                val intent = Intent(context,OtherActivity::class.java)
                intent.putExtra("data","从MainActivity跳转到OtherActivity")
                resultLauncher.launch(intent)
            }){
                Text("跳转到其他页面",fontSize = 30.sp,color = Color.White)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    二、其他活动OtherActivity的处理

    在其他活动中增加下列处理方式,来解决从当前活动返回上一个活动:

    val intent = Intent()
    intent.putExtra(“returnData”,“从OtherActivity返回”)
    context.setResult(Activity.RESULT_OK,intent)
    context.finish()
    这里:context表示活动。

    class OtherActivity : ComponentActivity() {
        @RequiresApi(Build.VERSION_CODES.TIRAMISU)
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val receivedData = intent.getStringExtra("data")
            setContent {
                ForCourseTheme {
                    Surface(
                        modifier = Modifier.fillMaxSize(),
                        color = MaterialTheme.colorScheme.background
                    ) {
                        DisplayScreen(receivedData)
                    }
                }
            }
        }
    }
    
    @Composable
    fun DisplayScreen(data:String?){
        val context  = LocalContext.current as OtherActivity
        Box(contentAlignment = Alignment.Center,
            modifier = Modifier.fillMaxSize().background(Color.Blue)){
            Column{
                Text("OtherActivity界面接受的数据:${data!!}",fontSize = 30.sp,color= Color.White)
                Button(onClick={
                    val intent = Intent()
                    intent.putExtra("returnData","从OtherActivity返回")
                    context.setResult(Activity.RESULT_OK,intent)
                    context.finish()
                }){
                    Text("返回到MainActivity",fontSize = 30.sp,color = Color.White)
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    从傅里叶变换,到短时傅里叶变换,再到小波分析(CWT),看这一篇就够了(附MATLAB傻瓜式实现代码)
    Java延迟队列——DelayQueue
    FiddlerScript 脚本使用正则表达式替换响应内容
    Android——数据存储(一)(二十一)
    节点流和处理流详解
    linux篇【5】:环境变量,程序地址空间
    MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control)
    毕业季,既是告别,也是新的开始
    Redis内存回收机制-内存淘汰策略和过期策略
    Xcode 15 运行<iOS 14, 启动崩溃问题
  • 原文地址:https://blog.csdn.net/userhu2012/article/details/133750446