安卓开发(5)-在 Activity 之间发送数据(一)
前言
在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
。然后在主Activity
的xml
文件中添加一个按钮,然后为这个按钮添加跳转事件就可以了,下面就给出该按钮的代码:
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)
也就是有四种方法来传递数据:
- 直接使用
intent
的putExtra(java.lang.String, java.lang.String)
方法; - 将要传递的对象,复写
toString()
方法,拼接成JSON
字符串,然后还是直接使用intent
的putExtra(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 之间发送数据(一)相关推荐
- 【无标题】Android在activity之间发送数据(putExtra方法)
Activity 之间发送数据(putExtra方法详解) 当应用创建 Intent 对象以在 startActivity(android.content.Intent) 中用于启动新的 Activi ...
- 【好文推荐】Activity之间的数据传递方法汇总
在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法. 1.通过 Intent 传递 我们在进行 Activit ...
- android 不同activity之间传递数据
1> 不同activity之间传递数据: Intent intent=new Intent(); intent.setClass(activity1.this,activity2.class); ...
- 不同Activity之间传递数据--Bundle对象和startActivityForResult方法的实现
首先,由于Activity是Android四大组件之一,如果一个应用程序中包含不止一个Activity,则需要在AndroidManifest.xml文件中进行声明. 例如进行如下的声明(程序中包含两 ...
- Android中Activity之间的数据传递(Intent和Bundle)
当一个Activity启动另一个Activity时,常常会有一些数据传过去,对于Activity之间的数据交换更简单,因为两个Activity之间进行数据传递交换更简单,因为两个Activity之间本 ...
- andriod 多个Activity之间共享数据
在项目中要在多个Activity之间共享数据,刚开始想了多种方法,但是都失败了,通过查找资料,Android提供了一个叫Application的共享数据很合适,下面就贴出代码. 写一个继承Applic ...
- 安卓开发.四大组件.activity.1
安卓开发.四大组件.activity.1 转载于:https://www.cnblogs.com/motadou/p/3534056.html
- Android--Activity的跳转及Activity之间的数据传递
Activity的跳转及Activity之间的数据传递(作业) 首先呢,看到这个作业第一感觉并不难,因为只是涉及到多activity之间的跳转以及简单的数据传递而已.然后,做的时候也没花费多长的时间, ...
- android activity之间传递对象,Android Activity之间的数据传递
一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent ...
最新文章
- python潜力开源项目_比较了1000多个Python开源项目,精选出这34个
- 解决导入.vdi文件时报“uuid is exists”错误
- 数据数字mongodb 模糊查询以及$type使用
- 【原创】flume-1.3.0安装配置以及flume启动说明
- Android UI之ImageButton(带图标的按钮)
- Linux批量复制文件夹里的文件到另一个文件夹(问题:linux sh: /bin/cp: Argument list too long )
- 油画作品欣赏|奥地利艺术家克里姆特
- 修改telnet提示并非_热血传奇:老玩家揭秘!这4个地方都被盛大修改过,第3个80%都想不到...
- 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
- 数字带通传输系统matlab仿真实验,基于MATLAB的数字带通传输系统设计
- 网络准入系统,防病毒网关,统一威胁管理,堡垒主机,漏洞扫描
- linux环境Git客户端下载安装
- ISO27001体系的价值(详解)
- 分区助手磁盘移动毁我双系统
- DDD(领域驱动设计)系列主题:DDD战略设计和战术设计分析流程及关键输出物
- 撸羊毛之殇系列——之抖音极速版
- ADP(自适应动态规划)-HDP
- 用iSee图片专家制作淘宝店标教程
- 【代码笔记】持续更新:知识图谱——gensim.corpora
- div层调整zindex属性无效原因分析及解决方法
热门文章
- IDEA项目External Libraries中没有Maven依赖包
- Js替换字符串的几种方法
- Apache Kafka 基准测试:每秒 200 万次写入(在三台廉价机器上)
- jQuery-select2 官方文档笔记(一)——基础应用
- appcode打开workspace无法找到xcodeproj项目文件问题的解决方法
- Window下合并多个文件(例如:SQL文件)到一个文件
- 很细的项目部署上线流程(一)服务器搭建环境从0开始,Linux安装JDK安装nginx部署ssl证书安装git安装node安装pm2安装maven
- 【VB与数据库】——数据库连接
- 2010年圣诞节祝福短信大全
- 2022茶艺师(中级)上岗证题库及模拟考试