Android 基本(3) - Activity 间的数据传递 使用 Intent

前言

在 Android 的程式中跨越不同 Activity 传递资料是非常频繁且常见到的事情,那显而易见的是一定也会有着非常多的方式可以达成这个目的,而其中最为常见的应该就属使用 Intent 来传递。(这边就单纯以真的去传递资料为主,不考虑使用全域变数、SharedPreferences、Data base等储存的方式)

其中接下来的主角 Intent 在前一篇有做过简单的介绍,他基本的概念以及可以附加的属性也都有做过说明,那我们今天最主要的重点也会是提过的一个属性 额外资料。


正文

发送
大概有了一点想法后我们也可以正式开始了,在有前一篇的了解下,我们已经可以使用 intent 来唤醒另一个 activity,那我们要是想要在这个唤起的过程中加入我们想要传递的资料,我们可以在创建 intent 的同时做另一件事情:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);intent.putExtra("Extra Data", "Hello!");startActivity(intent);

在这个例子中就是我们在传递资料的做法,这个例子中的情境是由 FirstActivity 这个 Activity 唤醒 SecondActivity 这个 Activtiy,并且同时藉由 putExtra() 传递一则以 "Extra Data" 为 key value 的讯息,讯息内容是 "Hello!"

这边可以稍微注意一下,在前一章有提过 putExtra() 会有两个参数,第一个是"键名"(key name)、第二个是要传递的数据 (value),因此在这个例子中 "Extra Data" 是我们的 key ,也就是说在 SecondActivity 接收要取出数据时可以去以这个 key 做对应。

那有了发送,想当然而一定要有接收取出讯息的部分:

Intent intent = getIntent();String data = intent.getStringExtra("Extra Data");Log.d(*TAG*, data);

在目的地 Activity (SecondActivity) 中我们可以加入这段程式码,其实这里我们可以很简单的看出他的流程,初始化好 intent 后,使用 getStringExtra()并放入相对应的 key value 便可以取出我们目标的数据,那这里呼应一下前面说 有各式 putExtra() 这点,因为放入的数据类型可能有许对不一样的样貌,所以在取出的时候想当然也会有所差异,那在这个例子中因为放入的是 String 所以我们在取出的时候所使用的也是用 getStringExtra()

回传
到这边相信使用方式应该都有了解了,那我们既然可以传给目标,那接下来我们要做的事情当然是更进一步的让目标这个 Activity 可以把运算完的结果回传回来,让原本的 Activity 可以知道对象做了甚么事情有么什么结果。

那我们该如何下手才有办法做到这个目标呢?这边跟前面比较不太一样的是在返回前一个 Activity 的时候,我们可以藉由点击"返回"(或是在 Android 10 后以向右滑的手势) 退回上一个画面,所以我们好像没有一个可以使用 intent 来传递资料的机会。

这时候我们可以稍微看一下 android dev doc 中,启动其他 activity 的动作当我们使用 startActivity() 的时候,会是单向的。但事实上启动其他 activity 的动作可以变成双向的动作,那想要达到这个目的也非常的简单,只需要我们把 startActivity() 改成 startActivityForResult() 即可,另外比较区要注意的是在 startActivityForResult() 中传入的参数有一点点的不同,他多了一个参数 -- 请求码。

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);intent.putExtra("Extra Data", "Hello!");startActivityForResult(intent, 1);

看了範例程式有没有觉得其实根本长得一模一样阿,那多出来的这个请求码是要用在甚么地方呢?

其实这个请求码是用在当返回这个 activity 的时候,我们可以使用这个请求码(request code)来进行判断,判断说这一个结果是我们发出的哪一个请求回来的。这是因为当我们在开发一个大型的专案的时候,很有可能在一个 activity 中会有很多机会会去触发其他的 activity 启动,那这些 activity 不见得相同,因此要如何去辨别这些 activity 回传时的不同呢?方式便是藉由这个请求码来判断了。

OK那发送端的第一个小部分先到这边,我们先把接收端处理好再回来这里。

在接收端我们也需要让他做好準备,当他今天要返回的时候要把它打算返回的数据回传:

Intent intent = new Intent();intent.putExtra("data return", "Hello! I am back!");setResult(RESULT_OK, intent);finish();

这边跟基本的写法相比有一点点的区别:

第一个是,在宣告 intent 的部分它并没有指定认得的对象,而是单传的负责传递资料。第二个是可以发现多了一行程式码,那就是 setResult() ,那这个方法它是专门负责向上一个 activity 返回数据的。它里面需要两个参数,第一个参数是用于向上一个 activity 返回处理结果 resultCode (通常为 RESULT_OKRESULT_CANCELED 这两个值),第二个参数是我们要回传回去的参数。最后再使用 finish() 结束当前这个 activity。

好的,在我们完成了接收端该做的事情后,我们也该回头把发送端处理处理,相信还记得我们刚刚是使用 startActivityForResult() 来启动 SecondActivity 的,那在 SecondActivity 被销毁回来的时候会去呼叫的就是我们现在要加入的部分 onActivityResult(),我们需要藉由覆写这个方法来取得我们想要的回传。

@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {    super.onActivityResult(requestCode, resultCode, data);    switch (requestCode) {        case 1:            if (resultCode == RESULT_OK) {                String returnData = data.getStringExtra("data return");                Log.d(TAG, returnData);                break;            }        default:            break;    }}

我们可以稍微先观察一下这段程式码,在 onActivityResult() 传入的参数部分可以看到有三个参数,其实稍微回忆一下前面提到的东西应该不难发现他们各自有所对应。

requestCode:在 startActivityForResult(intent, 1); 时的第二个参数,用来判断是哪个请求出去的回传。resultCode:在 setResult(RESULT_OK, intent); 时的第一个参数,用来判断回传的结果为何。data:如其名,便是我们所想要得到的回传数据。

这边了解了之后,那接下来的部分可以看出先进行判断是由哪个 requestCode 出去的,再来回传的结果是哪一个 resultCode,最后把回传的数据做输出就完成了喔。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章