安卓app开发中的intent传递数据理解之我见,如何理解安卓的intent数据传递(1)
安卓开发中经常遇到使用频率很高的家伙,例如 activity 、service、broadcast,contentprovider,桥梁工程师intent,应用保持着context等。这些东西对初学者来说可以说是一头雾水。今天我们来谈谈intent的知识。
intent意思"意图 用意",字面看不好理解。本身intent在安卓app中与界面显示无关的东西,也就是intent本身没有单独存在的意义。我们可以把它想象为无形桥梁,在app中大显身手,是app中无声工作者,向intent致敬!
我们知道,在玩弄app的时候,有很多界面的显示,比如启动一个app的时候会有个启动图界面1,然后倒计时后进入到了一个主界面(也可能是登录界面)。这个过程我们只知道界面切换了,其实背后intent在默默工作。
过程:界面1------通过intent启动----界面2
每个界面在安卓中被称为activity,因此 从一个activity启动另一个activity是intent的一个作用。说起由activity单独启动另一个activity,就有点光杆司令的味道,intent还有个携带礼物(数据参数)的功能。亲戚礼尚往来是常事,所以activity之间传递数据intent的基本功。说了一大堆,举个列子:
要想用intent,怎么地按照面向对象编程的思想,得造一个小哥出来,怎么造,是这样滴:
val intent = Intent(this, AnotherActivity::class.java) //kotlin中创建小哥不用new,两个参数很好理解,this代表了当前的activity, AnotherActivity代表了要启动的activty,简单吧,就这句话,出了一个名叫intent英雄小哥,这个小哥的作用就是要从this启动到another。
intent.putExtra(“key_from_main”, “data_from_main”) //小哥说:我出门要带礼物,去看another兄弟,于是乎就把数据通过自己办法putextra打包起来。但是带过去的礼物,对方要是看,就得打开礼物包,所以小哥还是很聪明的,每件礼物都标记了一个key,同时一个值标识什么礼物,对方去对标找礼物即可。小哥.putExtra(key,value)完毕。
startActivity(intent) //小哥说,我都准备好了,可以去another兄弟那里了。小哥做进车子startActivity一个启动,带到another那里了。startActivity()前面没有实例化对象的调用的,就是一个activity静态方法。小哥带来的数据,another兄弟非常高兴,很急切看看带了什么礼物,于是他得把礼物包打开:这是another兄弟要做的事,当然要编码在another兄弟的activity里。而且another兄弟很爱财,出生之时就要有这个拿礼物的功能。在 onCreate() 中接收。
val data = getIntent().getStringExtra(“key”) // intent小哥很受欢迎,专门有人接待,通过getIntent()找到intent小哥。然后毫不客气的从小哥那里取礼物。key就是小哥做的标记,礼物蛮简单的,小礼物哈哈。
把上面代码汇集一下:
当前activity中代码:
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra(“key_from_main”, “data_from_main”)
startActivity(intent)
anotherActivity oncreate方法里
val data = getIntent().getStringExtra(“key”)
这样小哥就完成了串门的事。
但是上面代码中,小哥做的车是startActivity(),这个车子有个毛病,只能带着小哥礼物出去,不能带礼物回来,也就是不能从another那里带回数据。小哥可能不高兴,我不做你这车子,我要带点东西回来,于是乎,换车子:startActivityForResult(intent , 100) 字面意思就是 一个有结果的车子。
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra(“key_from_main”, “data_from_main”)
startActivityForResult(intent , 100) //换成了这个车子,这个车子能携礼物回来,但可不省油,要费点脑子。我们先了解下,startActivityForResult(intent, requestCode) 这个是能返回礼物的车子,里面有个requestCode参数,干啥用呢?这里就是当anotheractivity结束的时候,会返回消息结果,其实就是一个数字,一般情况下,我们只需要保证requestCode>-1即可,这样回来的时候期初的activity能收到result。
怎么样才能给小哥intent回礼物呢?显然这是another兄弟的事。another兄弟并不笨,它自己有主见:它自己有自己的目的,找个intent1的小哥去做这件事如下:
val intent1 = Intent()
intent1.putExtra(“key_back”, “value_data”) // intent1小哥打包要返回的数据
setResult(RESULT_OK, intent1) // another兄弟指示返回去的结果状态,这里是RESULT_OK.期初来源activity会用到这个状态。
当another兄弟要送客关门了,就会把这个数据给送出,之前小哥光荣的完成了自己的事情,就谢幕了。接下来返回的礼物当然要接收了,谁接收呢,当然是起初来源的this接收,通过下面的方法收取返回的礼物。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { //注意这个方法是重写的super的方法,有3个参数匹配super的onactivityresult方法。requestCode: Int这个请求码,对应这里 startActivityForResult(intent , 100)100。当another兄弟退出舞台的时候,this源activity会收到setResult(RESULT_OK, intent1) 中的result_ok状态标志,也就是说resultcode是验证状态的。参数 intent持有返回来的打包数据小哥。
super.onActivityResult(requestCode, resultCode, data)
when(requestCode){ //存在有效请求码
100 -> if (resultCode == RESULT_OK){ //正确的收到了礼物
val returnData = data?.getStringExtra("key_data_return") //毫不客气的拿出礼物。
}
}
}
上面的过程,完成了从一个activity跳转到另一个activity的同时,并传递返回数据的过程讲解。主要是通过文章理解这个过程,至于更复杂的数据结果传递,都大同小异。希望本文对一些朋友有所帮助,即是我的最大快乐!
技术探讨:QQ 2047879076