intent的startActivityForResult()方法
/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
1、两种实现activity跳转的方法
实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();
例如activity A跳转到activity B
对于,第一种,是把activity A的数据,通过intent传送到activity B,但是不能返回数据。
关于第一种,可以参考我之前的这篇博文
http://blog.csdn.net/conowen/article/details/7270393
2、第二种方法startActivityForResult()的详细用法
今晚谈的是第二种方法startActivityForResult();可以实现把activity A数据传送给activity B,也可以把activity B的数据返回来给activity A处理。
- public void startActivityForResult (Intent intent, int requestCode)
首先startActivityForResult 有两个参数,第一个为当前activity的intent(假设为activity A),至于第二个参数的用法,还是先看一下官方SDK文档的解释
- requestCode : If >= 0, this code will be returned in onActivityResult() when the activity exits.
一般都是设置大于或者等于0,因为activity A可能不单单要跳转到activity B,也可能跳转到activity C,D,E……,这些activity返回来的数据都交由activity处理,那activity又通过什么来分辨返回来的数据到底是哪个activity回来的呢。
所以在activity A跳转到某一个activity时,要设定目标activity的requestCode,这个requestCode就唯一地标识了相对应的activity。
如下所示,当要跳转到activity B时,15表示是activity B的标识,
- IntentActivity.this.startActivityForResult(intent, 15);
同理,当在activity A的另外一个监听器要跳转到activity C时,设定activity C的标识为25。(大于或者等于0就行了)
- IntentActivity.this.startActivityForResult(intent, 25);
(通过onActivityResult方法可处理代表不同activity的requestCode数值,详细用法在第3点。)
3、数据处理方法onActivityResult()详解
然后activity A通过复写onActivityResult方法来处理这些activity返回来的数据。onActivityResult定义如下:
- protected void onActivityResult (int requestCode, int resultCode, Intent data)
3.1、数据处理方法onActivityResult()有三个参数,第一个requestCode是用来区分哪个activity回来的数据,可以通过swith语句来筛选。
基本框架代码如下:
- switch (requestCode) {
- case 15:
- switch (resultCode) {
- case 0:
- //do something
- break;
- case 1:
- //do something
- break;
- default:
- break;
- }
- break;
- case 25:
- switch (resultCode) {
- case 0:
- //do something
- break;
- default:
- break;
- }
- default:
- break;
- }
3.2、第二个参数为resultCode,也是一个int类型,如果activity B有几种不同返回的结果,同样地可以通过resultCode来筛选。
当跳转到其他activity时,如activity B。需要知道的是,把activity B的数据返回去给activity A的处理方法是setResult (int resultCode, Intent data) ,可以看到它的第一个参数是resultCode,也就是对应着相应的处理方式,官方的推荐取值如下,这些是宏变量,实质是int。当然也可以自定义为数值,自己习惯就行了。
- RESULT_CANCELED
- RESULT_OK
- RESULT_FIRST_USER
具体做法如下:如你可以在activity B做如下设置,两个button的监听器对应着两个resultCode,也就对应了两种处理方式,至于你要做什么事,在监听器定义即可。
- button1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //do something
- secondactivity.this.setResult(0, intent);
- secondactivity.this.finish();
- }
- });
- button2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //do something
- secondactivity.this.setResult(1, intent);
- secondactivity.this.finish();
- }
- });
3.3、第三个参数为Intent data,为activity返回来的数值,如通过data.getStringExtra("key");就可以取出来。
注意:调用setResult()方法跳回原来的activity时,一定要调用finish方法结束当前的activity
另外,如果activity A只需要跳转到activity B而已,那跳转时,request code只要大于或者等于0就行,而数据处理的方法onActivityResult()如下结构就行了,不用筛选request code。
- switch (resultCode) {
- case 0:
- //do something
- break;
- case 1:
- //do something
- break;
- default:
- break;
- }
===============================================================================================
附上详细代码
从第一个activity跳到第二个,主要是验证 resultCode,
从第一个activity跳到第三个activity 和跳到第二个activity,主要是验证requestCode
效果图:
- //IntentActivity为第一个activity
- package conowen.Activity.intent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class IntentActivity extends Activity {
- /** Called when the Activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button bt = (Button) findViewById(R.id.bt);
- Button bt2 = (Button) findViewById(R.id.bt13);
- bt.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(IntentActivity.this,
- secondactivity.class);
- // 将intent绑定到第二个activity,然后开始跳转到第二个Activity
- IntentActivity.this.startActivityForResult(intent, 15);
- // 第二个参数为requestCode,大于或等于0,
- }
- });
- bt2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(IntentActivity.this,
- requestCodetest.class);//将intent绑定在第三个activity
- IntentActivity.this.startActivityForResult(intent, 25);
- }
- });
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- super.onActivityResult(requestCode, resultCode, data);
- switch (requestCode) {// 通过requestCode来辨别数据来自哪个activity
- case 15:// 取得来自Activity2的数据,并显示于画面上
- switch (resultCode) {// 通过resultCode来辨别activity的相应处理方法
- case 0:
- String resultstr1 = data.getStringExtra("result");// 取出传回来的数据
- TextView tv = (TextView) findViewById(R.id.tv);
- tv.setText(resultstr1);// 显示出来
- break;
- case 1:
- String resultstr2 = data.getStringExtra("result");
- TextView tv1 = (TextView) findViewById(R.id.tv);
- tv1.setText(resultstr2);
- Toast.makeText(this,
- "第2个activity的requestCode的值为" + requestCode,
- Toast.LENGTH_LONG).show();
- break;
- default:
- break;
- }
- break;
- case 25:
- switch (resultCode) {
- case RESULT_OK:
- String resultstr3 = data.getStringExtra("result3");
- Toast.makeText(this,
- "第3个activity的requestCode的值为" + requestCode,
- Toast.LENGTH_LONG).show();
- TextView tv = (TextView) findViewById(R.id.tv);
- tv.setText(resultstr3);
- break;
- default:
- break;
- }
- default:
- break;
- }
- }
- }
- //secondactivity为第二个activity
- package conowen.Activity.intent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class secondactivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.secondactivity);
- // 获取启动这个activity的intent
- Button returnbt1 = (Button) findViewById(R.id.returnbt1);
- final Intent intent = getIntent();
- returnbt1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- EditText et = (EditText) findViewById(R.id.et);
- String res = et.getText().toString();
- intent.putExtra("result", res);// 把数据塞入intent里面
- secondactivity.this.setResult(0, intent);// 跳转回原来的activity
- secondactivity.this.finish();// 一定要结束当前activity
- }
- });
- Button returnbt2 = (Button) findViewById(R.id.returnbt2);
- returnbt2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- intent.putExtra("result", "验证result code");
- secondactivity.this.setResult(1, intent);
- secondactivity.this.finish();
- }
- });
- }
- }
- //requestCodetest是第三个activity
- package conowen.Activity.intent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class requestCodetest extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.requestcode);// layout的xml文件名不能为大写字母
- Button bt3 = (Button) findViewById(R.id.returnbt3);
- bt3.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- // 这个activity主要是为了验证requestCode
- EditText et3 = (EditText) findViewById(R.id.et3);
- Intent intent = getIntent();// 获取启动这个activity的intent
- String res = et3.getText().toString();
- intent.putExtra("result3", res);
- requestCodetest.this.setResult(RESULT_OK, intent);
- requestCodetest.this.finish();
- }
- });
- }
- }
intent的startActivityForResult()方法相关推荐
- 以回调形式使用startActivityForResult方法,并解决Activity被回收的问题
前言 之前写过一篇文章写一个逻辑清晰的startActivityForResult(),拒绝来回扒拉代码,写了使用回调形式使用startActivityForResult方法,配合Kotlin的语法, ...
- Android:通过startActivityForResult方法来得到Activity的回传值
在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方 ...
- startActivityForResult方法过时
使用代码调用系统相机进行拍摄照片发现调用startActivityForResult方法过时 查看竟然被标志为Deprecated 于是带着好奇心去研究一番,既然这个过时了,那要怎么使用原本的star ...
- 【转】Android 之最新最全的Intent传递数据方法
原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...
- 解决Android 7.0及以上版本文件暴露异常exposed beyond app through Intent.getData()的方法
转载:https://www.icode9.com/content-4-619191.html 我们在APP升级的时候进行下载安装,却在Android 7.0及以上版本会报错 android.os.F ...
- Android调用摄像头--农民伯伯原文
Android开发指南(33) -- Multimedia and Camera - Camera 前言 本章内容为Android开发者指南的 Framework Topics/Multimedia ...
- Camera,音频录制与Vitamio框架
总览 一.Camera 1.概述 2.所需权限声明 3.使用内置的摄像头应用程序 具体步骤 案例 二.音频录制-MediaRecord 1.使用步骤 2.所需权限 3.简单示例 4.优缺点以及注意事项 ...
- Android第一行代码-Activity
文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...
- 【Android开发技巧】 关于Webview拍照或从相册上传图片处理总结
新博客 前言: 各公司为了处理更多的业务流程, 一般都会加入H5与原生交互处理,方便快速开发,迭代项目.但,在Android中,H5与原生的交互处理的就没有iOS那么好.其中适配也是一个问题,Andr ...
最新文章
- 文件分割器,一个读取流,相应多个输出流,并且生成的碎片文件都有有序的编号...
- c++图书管理系统_轻松学做C语言课程设计:图书管理系统-数组实现
- 开发中遇到的Cause: java.sql.SQLException: connection holder is null的异常
- Mysql导出数据 (windows Linux)
- Flutter之_slot 插槽属性详解
- 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构
- 中文文本标注工具调研以及BRAT安装使用
- 计算机毕业设计源码—Springboot驾校考试网站系统
- linux下xampp的使用教程,Linux下安装xampp教程
- pixel bender 学习备忘录
- 牛皮凉席不好的原因!
- 基于Python的人脸识别(68个识别点)和焦点人物检测
- 【SSM电商项目后台开发】001-数据库建表
- 一直都以为阿里的程序员待遇是最好的,结果真正的土豪竟然是……
- Java调用有道翻译API包括APPID/密钥地址注册
- ArcGIS栅格数据四参数七参数投影变换
- 烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一 个小时十五分钟呢?(微软面试题)
- 有n个人围成一圈 顺序排号 java_java有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出...
- 函数式编程与Lambda表达式
- python一句代码生成26个英文字母
热门文章
- 达达真人漫画秀,微博演绎男版杜拉拉生存记
- 用“ul+li”及css制作韩国风格菜单
- selenium 3+python3.6 for MacOS的配置
- ios 自动布局框架
- kiss原则包括什么_求职干货想让HR瞬间对你产生好感?简历做好这三个原则
- Xamarin Essentials教程语音播报TextToSpeech
- string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...
- Python-Evoked地形图可视化
- Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理
- AAAI第二届“AI诺奖”出炉,百万美元奖金颁给批判黑箱、推广可解释AI的杜克大学女教授...