Activity跳转(有返回数据跳转)以及传递参数和回传参数

使用Bundle在Activity之间传递数据

  • Bundle类是一个key-value对,是一个final类
  • 两个Activity之间通信可以用Bundle类实现步骤:
  1. 新建一个Bundle类
    Bundle bundle=new Bundle();
  2. bundle类中加入数据(key-value的形式)
    bundle.putString("data", "张三");
  3. 新建一个Intent对象,并将该Bundle加入该Intent对象
    Intent intent=new Intent();
    intent.setClass(TestBundle.this, Target.class);
    intent.putExtras(bundle);
  4. 启动Intent
    startActivity(intent);
  5. 第二个Activity接收传递过来的数据
    Intent intent=getIntent();
    Bundle bundle =intent.getExtras();
    String data = bundle.getString("data");//读出数据
  • 传递的数据类型
    简单或者基本数据类型boolean、byte、char、String、Long、Short、Int等类型数据

使用Intent在Activity之间传递数据

  • 步骤:
  1. 传递数据
    Intent intent=new Intent();
    //键值对
    intent.putExtra("extra", "archie2010");
    //从此ctivity传到另一Activity
    intent.setClass(OneActivity.this, OtherActivity.class);
    //启动另一个Activity
    OneActivity.this.startActivity(intent);
  2. 接收数据
    //获得从上一个Activity传来的intent对象
    Intent intent=getIntent();
    String stringValue=intent.getStringExtra("extra");
  • 传递基本数据类型数据
    Intent putExtra(String name, int[] value)
    Intent putExtra(String name, float value)
    Intent putExtra(String name, byte[] value)
    Intent putExtra(String name, long[] value)
    Intent putExtra(String name, float[] value)
    Intent putExtra(String name, long value)
    Intent putExtra(String name, String[] value)
    Intent putExtra(String name, boolean value)
    Intent putExtra(String name, boolean[] value)
    Intent putExtra(String name, short value)
    Intent putExtra(String name, double value)
    Intent putExtra(String name, short[] value)
    Intent putExtra(String name, String value)
    Intent putExtra(String name, byte value)
    Intent putExtra(String name, char[] value)
    Intent putExtra(String name, CharSequence[] value)

序列化

  • 什么是序列化 、反序列化
    对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
    对象的反序列化:把字节序列恢复为Java对象的过程。
    Activity之间还可以传递类的对象,传递之前必须要进行序列化。
    (在Android里面要想在Activity之间传递类的对象,必须将类进行序列化)
  • 序列化的目的
  1. 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)
  2. 通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)
  3. 将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)
  4. Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
  5. 序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
  6. 在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

序列化的方式

1.自定义类实现Serializable接口

public class Student implements Serializable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后传递自定义类的对象
Bundle.putSerializable(Key,Object); //实现Serializable接口的对象

  • 使用Bundle在Activity之间传递对象数据

传递数据如下:
Intent intent=new Intent(MainActivity.this,MyActivity.class
Bundle bundle=new Bundle();
Student student=new Student();
student.setName("张三");
bundle.putSerializable("student",student); startActivity(intent);

接收数据如下:
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
Student student=(Student) bundle.getSerializable("student");

2.自定义类实现Parcelable接口
  • 步骤:
    a、复写describeContents方法和writeToParcel方法
    b、实例化静态内部对象CREATOR,实现接口Parcelable.Creator

将变量写出
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(name);
dest.writeInt(age);
}

将变量进行读取
public static final Creator<Student1> CREATOR =new Creator<Student1>(){
};

序列化之后就可以传递对象了,传递方式如下:
使用Bundle在Activity之间传递对象数据

传递数据如下:
Intent intent=new Intent(MainActivity.this,MyActivity.class
Bundle bundle=new Bundle();
Student1 student=new Student1();
student.setName("张三");student.setage(20)
bundle.putParcelable("student",student);
intent.putExtras(bundle);
startActivity(intent);

接收数据如下:
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
Student1 student=(Student) bundle.getParcelable("student");

Activity跳转回传

  • 在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。
  • 举个例子:页面1跳转到页面2,页面2再返回页面1同时返回数据
    步骤:
  1. 页面1添加如下代码:

Intent intent = new Intent();
intent.setClass(页面1.this, 页面2.class);
Bundle bundle = new Bundle();
bundle.putInt(“a”,2);
bundle.putInt(“b”,3);
intent.putExtras(bundle);
startActivityForResult(intent, 0);// 跳转并要求返回值,0代表请求值(可以随便写)

  1. 页面2接收数据:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
int a=bundle.getInt("a");//获取页面1传递过来的数
int b=bundle.getInt(“b”);
int c=a+b;

  1. 页面2设置返回页面1数据:

Intent intent = new Intent;
Bundle bundle = new Bundle();
bundle.putInt(“sum”,c);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);

4.页面1接收返回数据:(需要重写onActivityResult)
onActivityResult(int requestCode, int resultCode, Intent data)
  第一个参数:这个整数requestCode用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。
  第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。
  第三个参数:一个Intent对象,带有返回的数据。可以通过data.getXxxExtra( );方法来获取指定数据类型的数据

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0&&resultCode==RESULT_OK){
Bundle bundle=data.getExtras();
int sum=bundle.getInt("sum");
Toast.makeText(MainActivity.this, sum+"", Toast.LENGTH_LONG).show();
}
}

Activity跳转回传注意事项

protected void onActivityResult(int requestCode, int resultCode, Intent data)
方法里面的第一个参数,必须要跟startActivityForResult(intent, 0)一致;
第二个参数,必须与setResult(RESULT_OK, intent2)一致,判断是同一个数字即可

原因:
如果出现两个以上回传,请求码设置不同的,回传回来的数据处理就需要根据不同的requestCode进行分别处理。

小结

  • Activity之间可以用Bundle传递数据,但是Bundle必须放到Intent里面,最后通过Intent传递数据
  • Activity之间进行数据回传,一个Activity可以传递给多个Activity,接收多个Activity返回的数据
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1、Intent 可以传递的数据类型 在 Intent和IntentFilters(1) 中我们知道了通过 Int...
    CnPeng阅读 2,756评论 0 10
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,373评论 0 17
  • 【 Android四大组件之一 主要用于与用户进行交互,在一个App中可能存在零个或多个Activity 】 1....
    征程_Journey阅读 1,941评论 0 4
  • 文/江南风景 我是喜欢看书的,记得很小的时候,我就买了红楼梦,并且小学三年级时就把同桌父亲的一本西游记看完了,那...
    江南风景打工者的正能量阅读 334评论 0 1
  • 今天下午,在往茂县的客车上看了一部老电影——《新龙门客栈》。 塞外、大漠、客栈、侠客、义士,猛然一...
    君子温和阅读 1,312评论 0 0