前言

Activity交互的过程中,肯定需要在两个Activity之间传递数据。根据您的 Activity 是否希望从即将启动的新 Activity 中获取返回结果,您可以使用 startActivity()startActivityForResult()方法启动新 Activity。这两种方法都需要传入一个 Intent 对象。
Intent 对象指定您要启动的 Activity,或描述您要执行的操作类型(系统为您选择相应的 Activity,该 Activity 甚至可以来自不同应用)。Intent 对象还可以携带由已启动的 Activity 使用的少量数据。
所以在Activity交互的过程中有三种情况:

  • A启动B,不需要传递数据,从A直接跳转到B
  • A启动B,需要传递数据,从A带数据跳转到B,从B接收数据;
  • A启动B,传递数据可选,从A(带数据或者不带)跳转到B,从B接收数据,然后从B返回数据到A
    下面就根据我这里拟定的三种情况,分别简单讲讲,就用代码实现:

1 直接跳转到B

其实这种情况前面都实现过了,就是直接调用调用 startActivity() 方法来启动它。
就是再建一个Activity和对应的xml文件,然后在Mainfest配置文件中注册这个Activity。然后在主Activityxml文件中添加一个按钮,然后为这个按钮添加跳转事件就可以了,下面就给出该按钮的代码:

btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setClass(MainActivity.this, OtherActivity.class);MainActivity.this.startActivity(intent);}
});

2 跳转并传递数据到B

当应用创建 Intent 对象以在 startActivity(android.content.Intent) 中用于启动新的 Activity 时,应用可使用 putExtra(java.lang.String, java.lang.String) 方法传入参数。
不难发现,putExtra是以key-value的形式来传递字符串。也就是简单类型。如果当我们需要传递复杂类型的时候,比如一个对象或者一个数据列表,我们又应该如何实现?
可能大家很快就能想到,就是使用JSON来实现,就是putExtra不是传递字符串,直接将对象变成JSON串,然后得到后再解析,的确可以。
但是,不是这里我们所需的,官方文档中的原话是这样说的:

我们建议您使用 Bundle 类为 Intent 对象设置操作系统已知的基元。
在某些情况下,您可能需要一种机制来跨 Activity 发送复合对象或复杂对象。在这种情况下,自定义类应实现 Parcelable,并提供相应的 writeToParcel(android.os.Parcel, int) 方法。它还必须提供实现 Parcelable.Creator 接口的非空字段 CREATOR,该接口的 createFromParcel() 方法用于将 Parcel 转回为当前对象。

也就是说,我们需要用Bundle来封装数据,创建Intent对象,在Bundle中提供了这么一个方法:

// 将Parcelable值插入此Bundle的映射中,替换给定键的任何现有值。
putParcelable(String key, Parcelable value)

在网上查了下,在Bundle中,还可以使用序列化的方法来传递对象:

// 将一个可序列化的值插入此Bundle的映射中,替换给定键的任何现有值。
putSerializable(String key, Serializable value)

也就是有四种方法来传递数据:

  • 直接使用intentputExtra(java.lang.String, java.lang.String) 方法;
  • 将要传递的对象,复写toString()方法,拼接成JSON字符串,然后还是直接使用intentputExtra(java.lang.String, java.lang.String) 方法;
  • 利用Bundle来构建意图对象intent,该Bundle中利用putParcelable(String key, Parcelable value)方法来封装一个实现了Parcelable接口的对象。
  • 利用Bundle来构建意图对象intent,该Bundle中利用putSerializable(String key, Serializable value)方法来封装一个实现了Serializable接口的对象。

下面就分别来实现一下:

2.1 使用putExtra传递简单字符串

还是用两个Activity,主Activity中是一个按钮,接收Activity中是一个文本组件。和前面一样,写对应的xml文件,和在配置文件中注册接收Activity的信息。
首先在主Activity中为按钮添加监听事件:

btn = (Button)findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.putExtra("name", "无涯明月");intent.setClass(MainActivity.this, OtherActivity.class);MainActivity.this.startActivity(intent);}
});

然后,在接收Activity中处理,接收数据,我这里的代码是这样实现的:
写在待接收Activity中的onCreate()周期函数中

setContentView(R.layout.activity_other);
// 接收数据开始
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
TextView textView = (TextView)findViewById(R.id.textview);
textView.setText(bundle.getString("name"));

效果:

2.2 使用putExtra传递JSON字符串

套路和上一个一样,只是这里多了一些处理。首先新建一个学生类,然后添加构造方法,复写toString()方法。我这里定义了三个字段,它的toString()方法如下:

@Override
public String toString() {return "{'name':'"+ this.name +"','sex':'"+ this.sex +"','age':" + Integer.toString(age)+"}";
}

然后就是在主Activity中传递这个JSON串:

btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();student student = new student("无涯明月", "男", 18);intent.putExtra("obj", student.toString());intent.setClass(MainActivity.this, OtherActivity.class);MainActivity.this.startActivity(intent);}
});

最后就是在待接收数据的Activity中来处理这个字符串,还是在onCreate方法中处理数据:

setContentView(R.layout.activity_other);
// 开始接收并处理数据
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
String str = bundle.getString("obj");
JSONObject jsonobj = null;
try {jsonobj = new JSONObject(str);TextView textView = (TextView)findViewById(R.id.textview);textView.setText("姓名:" + jsonobj.getString("name") + ",性别:" + jsonobj.getString("sex") + ",年龄:" + Integer.toString(jsonobj.getInt("age")));
} catch (JSONException e) {e.printStackTrace();
}

最后效果:

至于JSON字符串的解析,我这里参考的是:java后端解析json数据,有兴趣可以看看。

2.3 使用putParcelable来传递对象

如果要使用Parcelable传递数据,官网中是这样说的:
Activity 发送复合对象或复杂对象。在这种情况下,自定义类应实现 Parcelable,并提供相应的 writeToParcel(android.os.Parcel, int) 方法。它还必须提供实现 Parcelable.Creator 接口的非空字段 CREATOR,该接口的 createFromParcel() 方法用于将 Parcel 转回为当前对象。
不难发现,一个是正向的对象写入Parcel,一个是从Parcel对象中创建对象,也就是写回来。
对Parcelable接口不了解的,不妨看看官方的说明。官方还给出了一个经典的案例:

 public class MyParcelable implements Parcelable {private int mData;public int describeContents() {return 0;}public void writeToParcel(Parcel out, int flags) {out.writeInt(mData);}public static final Parcelable.Creator<MyParcelable> CREATOR= new Parcelable.Creator<MyParcelable>() {public MyParcelable createFromParcel(Parcel in) {return new MyParcelable(in);}public MyParcelable[] newArray(int size) {return new MyParcelable[size];}};private MyParcelable(Parcel in) {mData = in.readInt();}}

很容易看懂它是在干什么,不妨我们这里模拟写一个学生类:

package com.example.fi;import android.os.Parcel;
import android.os.Parcelable;public class student implements Parcelable{private String name;private String sex;private int age;public student(String name, String sex, int age) {super();this.name = name;this.sex = sex;this.age = age;}@Overridepublic String toString() {return "解析结果  姓名:"+this.name+",性别:"+this.sex+",年龄:"+Integer.toString(this.age)+"。";}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel out, int flags) {out.writeString(this.name);out.writeString(this.sex);out.writeInt(this.age);}public static final Parcelable.Creator<student> CREATOR = new Parcelable.Creator<student>(){@Overridepublic student createFromParcel(Parcel source) {return new student(source.readString(), source.readString(), source.readInt());}@Overridepublic student[] newArray(int size) {return new student[size];}};
}

在主Activity中,我们传递数据:

btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();
//              Bundle方式 ,intent的putExtra中也可以放Pracelable
//              Bundle bundle = new Bundle();
//              student student = new student("无涯明月", "男", 18);
//              bundle.putParcelable("parce", student);
//              intent.putExtras(bundle);student student = new student("无涯明月", "男", 18);intent.putExtra("parce", student);intent.setClass(MainActivity.this, OtherActivity.class);MainActivity.this.startActivity(intent);}
});

传递数据有两种方式,一是使用Bundle,二是直接pueExtra,都可以。接收数据是一样的,在待接收数据的Activity中,接收数据的代码还是在onCreate周期函数中,代码如下:

setContentView(R.layout.activity_other);Intent intent = this.getIntent();
student student = intent.getParcelableExtra("parce");
TextView textView = (TextView)findViewById(R.id.textview);
textView.setText(student.toString());

效果:

感觉篇幅有点长了,这里没写完,下一章接着写。


参考文档:
[1] Android高手进阶教程(十七)之—Android中Intent传递对象的两种方法(Serializable,Parcelable)!
[2] Android开发官方文档-Parcelable 和 Bundle
[3] Android开发官方文档-从另一个 Activity 中启动某个 Activity
[4] java后端解析json数据


作者:无涯明月

真诚的希望这篇文章能够帮到您!如果你觉得这篇文章对您有帮助,不妨扫一扫下面的二维码加我微信,然后发个红包打赏一下。您的支持是我莫大的动力。真诚的祝愿大家学有所成!让我们一起加油!!!

安卓开发(5)-在 Activity 之间发送数据(一)相关推荐

  1. 【无标题】Android在activity之间发送数据(putExtra方法)

    Activity 之间发送数据(putExtra方法详解) 当应用创建 Intent 对象以在 startActivity(android.content.Intent) 中用于启动新的 Activi ...

  2. 【好文推荐】Activity之间的数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法. 1.通过 Intent 传递 我们在进行 Activit ...

  3. android 不同activity之间传递数据

    1> 不同activity之间传递数据: Intent intent=new Intent(); intent.setClass(activity1.this,activity2.class); ...

  4. 不同Activity之间传递数据--Bundle对象和startActivityForResult方法的实现

    首先,由于Activity是Android四大组件之一,如果一个应用程序中包含不止一个Activity,则需要在AndroidManifest.xml文件中进行声明. 例如进行如下的声明(程序中包含两 ...

  5. Android中Activity之间的数据传递(Intent和Bundle)

    当一个Activity启动另一个Activity时,常常会有一些数据传过去,对于Activity之间的数据交换更简单,因为两个Activity之间进行数据传递交换更简单,因为两个Activity之间本 ...

  6. andriod 多个Activity之间共享数据

    在项目中要在多个Activity之间共享数据,刚开始想了多种方法,但是都失败了,通过查找资料,Android提供了一个叫Application的共享数据很合适,下面就贴出代码. 写一个继承Applic ...

  7. 安卓开发.四大组件.activity.1

    安卓开发.四大组件.activity.1 转载于:https://www.cnblogs.com/motadou/p/3534056.html

  8. Android--Activity的跳转及Activity之间的数据传递

    Activity的跳转及Activity之间的数据传递(作业) 首先呢,看到这个作业第一感觉并不难,因为只是涉及到多activity之间的跳转以及简单的数据传递而已.然后,做的时候也没花费多长的时间, ...

  9. android activity之间传递对象,Android Activity之间的数据传递

    一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent ...

最新文章

  1. python潜力开源项目_比较了1000多个Python开源项目,精选出这34个
  2. 解决导入.vdi文件时报“uuid is exists”错误
  3. 数据数字mongodb 模糊查询以及$type使用
  4. 【原创】flume-1.3.0安装配置以及flume启动说明
  5. Android UI之ImageButton(带图标的按钮)
  6. Linux批量复制文件夹里的文件到另一个文件夹(问题:linux sh: /bin/cp: Argument list too long )
  7. 油画作品欣赏|奥地利艺术家克里姆特
  8. 修改telnet提示并非_热血传奇:老玩家揭秘!这4个地方都被盛大修改过,第3个80%都想不到...
  9. 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
  10. 数字带通传输系统matlab仿真实验,基于MATLAB的数字带通传输系统设计
  11. 网络准入系统,防病毒网关,统一威胁管理,堡垒主机,漏洞扫描
  12. linux环境Git客户端下载安装
  13. ISO27001体系的价值(详解)
  14. 分区助手磁盘移动毁我双系统
  15. DDD(领域驱动设计)系列主题:DDD战略设计和战术设计分析流程及关键输出物
  16. 撸羊毛之殇系列——之抖音极速版
  17. ADP(自适应动态规划)-HDP
  18. 用iSee图片专家制作淘宝店标教程
  19. 【代码笔记】持续更新:知识图谱——gensim.corpora
  20. div层调整zindex属性无效原因分析及解决方法

热门文章

  1. IDEA项目External Libraries中没有Maven依赖包
  2. Js替换字符串的几种方法
  3. Apache Kafka 基准测试:每秒 200 万次写入(在三台廉价机器上)
  4. jQuery-select2 官方文档笔记(一)——基础应用
  5. appcode打开workspace无法找到xcodeproj项目文件问题的解决方法
  6. Window下合并多个文件(例如:SQL文件)到一个文件
  7. 很细的项目部署上线流程(一)服务器搭建环境从0开始,Linux安装JDK安装nginx部署ssl证书安装git安装node安装pm2安装maven
  8. 【VB与数据库】——数据库连接
  9. 2010年圣诞节祝福短信大全
  10. 2022茶艺师(中级)上岗证题库及模拟考试