Android基础之intent传值方法和传递大量数据方案

https://blog.csdn.net/chenliguan/article/details/47188243
1 Android之intent传值的三种方法

(1) startActivity();
(2) startActivityForResult();
(3)3 调用在下个activity自定义的方法"actionStart()",也就是最佳的方法。

2 最常用传值跳转:startActivity()方法

2.1 MainActivity

// 在MainActivity中定义如下代码 
button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this,TwoActivity.class);//在Intent对象当中添加一个键值对intent.putExtra("key","value");                 startActivity(intent);}
});

2.2 TwoActivity

// 在TwoActivity中定义如下代码
public class TwoActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//取得从上一个Activity当中传递过来的Intent对象Intent intent = getIntent();//从Intent当中根据key取得valueif (intent != null) {String value = intent.getStringExtra("key");}}});}
}

3 回调数据式传值跳转:startActivityForResult()方法

3.1 MainActivity

button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this,TwoActivity.class);intent.putExtra("key", "value");// 第二个参数是请求码,只要是一个唯一值startActivityForResult(intent, 1234);}
});// 由于我们是使用startActivityForResult()方法来启动TwoActivity的,在TwoActivity被销毁之后会回调上一个活动的onActivityResult()方法@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {switch (requestCode) {case 1234:if (resultCode == RESULT_OK) {//接收对象//Bundle bundle = data.getExtras();//AddressBean addressBean = (AddressBean) bundle.getSerializable(Constant.ADDRESSBEAN);String returnedData = intent.getStringExtra("key1");}break;default:}}

3.2 TwoActivity

public class TwoActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//接收从MainaActivity传递的数据Intent intent = getIntent();if (intent != null) {String value = intent.getStringExtra("key");}button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//传递对象//Intent intent = new Intent();//Bundle bundle = new Bundle();//bundle.putSerializable(Constant.ADDRESSBEAN, addressArray.get(position));//intent.putExtras(bundle);//setResult(RESULT_OK, intent);//finish();Intent intent = new Intent();intent.putExtra("key1","value two activity");// 专门用于向上一个活动返回数据。第一个参数用于向上一个活动返回结果码,一般只使用RESULT_OK或RESULT_CANCELED这两个值setResult(RESULT_OK, intent);finish();}});}
}

4 启动活动的最佳写法

4.1 问题描述

在真正的项目开发中经常会有对接的问题出现。如:TwoActivity并不是由你开发的,但现在你负责的部分需要有启动TwoActivity这个功能,而你却不清楚启动这个活动需要传递哪些数据。

4.1 MainActivity

button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {/*最佳数据传值方法:调用在下个activity自定义的方法*/TwoActivity.actionStart(MainActivity.this, "data1", "data2");}
});

4.2 TwoActivity

public class TwoActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}//最佳数据传值方法public static void actionStart(Context context, String data1, String data2) {Intent intent = new Intent(context, TwoActivity.class);intent.putExtra("param1", data1);intent.putExtra("param2", data2);context.startActivity(intent);}
}

4.3 结论

实现后,所有TwoActivity中需要的数据都是通过actionStart()方法的参数传递过来的,然后把它们存储到Intent中,最后调用startActivity()方法启动TwoActivity。

5 通过 Binder 传递数据的限制

5.1 Binder 传递数据限制

(1)Activity 界面跳转时,使用 Intent 传递数据是最常用的操作了。但是 Intent 传值偶尔也会导程序崩溃,比如以下代码:
在这里插入图片描述
(2)在 startFirstB 方法中,跳转 FirstB 页面,并通过 Intent 传递 Bean 类中的数据。但是执行上述代码会报如下错误:
在这里插入图片描述
上面 log 日志的意思是 Intent 传递数据过大,最终原因是 Android 系统对使用 Binder 传数据进行了限制。通常情况为 1M,但是根据不同版本、不同厂商,这个值会有区别

5.2 解决办法:

5.2.1 减少通过 Intent 传递的数据,将非必须字段使用 transient 关键字修饰。

比如上述 Bean 类中,假如 byte[] data 并非必须使用的数据,则需要避免将其序列化,如下所示:
在这里插入图片描述

1 添加 transient 修饰之后,再次运行代码则不会再报异常。

2 transient 使用小结

(1)被 transient 关键字修饰的变量不再能被序列化,一个静态变量不管是否被 transient 修饰,均不能被序列化,该变量内容在序列化后无法获得访问。
(2)transient 关键字只能修饰变量,而不能修饰方法和类。注意:本地变量是不能被transient关键字修饰的;如果是用户自定义类变量,则该类需要实现Serializable接口。

5.2.2 将对象转化为 JSON 字符串,减少数据体积

(1)因为 JVM 加载类通常会伴随额外的空间来保存类相关信息,将类中数据转化为 JSON 字符串可以减少数据大小。比如使用 Gson.toJson 方法。

(2)但是大多时候,将类转化为 JSON 字符串之后,还是会超出 Binder 限制,说明实际需要传递的数据是很大的。这种情况则需要考虑使用本地持久化来实现数据共享,或者使用 EventBus 来实现数据传递

(3)关于 Binder 机制的原理分析。可以参考网上以下两篇文章:

  • 老罗 Binder 源码分析
  • 听说你 Binder 机制学的不错,来面试下这几个问题

6 Intent传递类对象

6.1 两种方式

Android中Intent传递类对象提供了两种方式,一种是:通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象。Intent中传递这2种对象的方法:

Bundle.putSerializable(Key,Object);  //实现Serializable接口的对象  
Bundle.putParcelable(Key, Object); //实现Parcelable接口的对象

6.2 步骤

(1) 创建一个序列化类:User

public class User implements Serializable {private int ID;private String UserName;    private String PWD;    public final void setID(int value){ID = value;}public final int getID(){return ID;}    public final void setUserName(String value){UserName = value;}public final String getUserName(){return UserName;}  public final void setPWD(String value){PWD = value;}public final String getPWD(){return PWD;}    
}

(2) 发送对象(通过Bundle来封装数据)

Intent intent = new Intent();
intent.setClass(Login.this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);
this.startActivity(intent);

(3)接收对象

Intent intent = this.getIntent(); 
user=(User)intent.getSerializableExtra("user");

6.3 补充

如果传递的是List,可以把list强转成Serializable类型,而且object类型也必须实现了Serializable接口

Intent.putExtras(key, (Serializable)list) //发送
(List<YourObject>)getIntent().getSerializable(key) //接收

6.4 传递多个String或者多个集合

Bundle bundle = new Bundle();
//将多个String封装成String[]
String[] idTag = new String[{"id","tag"};
bundle.putStringArray(Config.KEY_IDTAG_ARRAY, idTag);//传递字符串数组//将对象集合封装在一个对象中,传递对象
ListBean listBean = new ListBean();
listBean.setParamList(paramList);
listBean.setAddCartList(addCartList);
bundle.putSerializable("key", listBean);//传递集合对象
startActivityForResult(AddCartActivity.class, cartBundle, 0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53350.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取手机APP对网络访问数据的一个思路

工作中要用到一款android下的APP软件&#xff0c;其中有一个功能是查看课件的pdf资料&#xff0c;每个资料后面还有一个下载的按钮&#xff0c;但是都是不可用&#xff0c;注释写到不提供下载&#xff0c;估计是考虑到版权问题吧。但真的非常需要其中的资料&#xff0c;怎么办呢…

intent传递较大数据的解决和intent不能传递较大数据的原因

一、首先提供需要在activity之间用intent传递较大数据的方法。intent不能传递较大数据&#xff0c;需要传递数据的时候&#xff0c;写一个操作类&#xff1a; public class DataHelper {private static final DataHelper helper new DataHelper();public static DataHelper ge…

小米手机,程序在后台运行一段时间之后,访问不了网络

小米手机&#xff0c;程序后台运行一段时间后&#xff0c;程序访问不了网络&#xff0c;访问超时&#xff0c;锁屏不锁屏都是一样&#xff0c;&#xff08;不知道QQ为啥可以收到&#xff09; 暂时找到的解决方案&#xff1a; 小米手机--设置--其他高级设置--电源和性能--神隐…

OpenAI API最新速查表;轻松制作数字分身;8个ChatGPT「作弊」策略;微软提示工程官方教程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; The OpenAI API in Python 最新速查表 ShowMeAI知识星球资源编码&#xff1a;R102 大语言模型的发展&#xff0c;正在推动 OpenAI API…

国外电子测量技术投稿经验

国外电子测量技术和电子测量技术是同一系列&#xff0c;2020年入选北大中文核心期刊&#xff0c;相对来说比较好中&#xff0c;审稿专家非常亲和&#xff0c;提出的问题都挺好回复和解答。审稿周期不到两个月&#xff0c;编辑退修以后就特别快了。 以下是投稿过程&#xff1a…

小红书用户消费心理及种草价值:后疫情时代消费心理研究

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告盘点 ChatGPT种子用户招募&#xff08;无限制次数直接使用&#xff09; 小红书整体框架及玩法大全 小红书爆文笔记进阶指南 罗振宇2023年跨年演讲PPT原稿…

Linux的ip经常变动的解决方法

第一步&#xff1a;查看ip 通过ip addr命令查询本机IP地址&#xff0c;可以看出是ens33网卡   如果我们不设置固定的ip地址&#xff0c;那么IP地址就会自动变更&#xff0c;所以我们通过编辑配置文件将IP地址写死 第二步&#xff1a; 编辑 ens33 网卡的网络配置文件 在Linu…

如何修复和解决 IP 地址冲突

您的网络是否面临 IP 分配错误&#xff0c;或者网络中的某些用户抱怨网络连接丢失&#xff1f;好消息是您的主机或服务器没有运行病毒;相反&#xff0c;它遇到了导致网络连接问题的IP 地址冲突&#xff0c;您可以在几分钟内修复它。 Windows 在网络错误消息中抽象地将此错误的原…

虚拟机中ip地址总是自动变化解决办法

在一开始我创建的虚拟机去用XShell远程连接的时候&#xff0c;我的主机地址总是变化&#xff0c;上一次还是192.168.57.151&#xff0c;下一次就变成了192.168.57.153&#xff0c;再下一次就不知道变成了什么&#xff0c;就很麻烦&#xff0c;每次都要去修改会话属性&#xff0…

python如何解决爬虫ip被封- - -“您操作太频繁,请稍后再访问“

描述 python 3.9.6 pycharm 问题 当我想爬取某招聘网站的信息的时候出现如下信息 {"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"113.92.xxx.xxx","state":2402} 原因 招聘网站的反爬机制…

视频转文字怎么转?这3个方法可以将视频转为文字

短视频如火如荼的发展&#xff0c;使得很多人都加入到视频创作的行业中。在视频剪辑过程中&#xff0c;有些需要我们给视频添加字幕&#xff0c;那大家是怎么操作的呢&#xff1f;是一边观看视频&#xff0c;一边打字添加吗&#xff1f;其实不用那么麻烦&#xff0c;现在市面上…

视频转文字如何操作?几种方法带你了解如何视频转文字

不知道大家有没有和我一样的困扰&#xff0c;老师经常发送课堂录屏供我们课后复习&#xff0c;但是视频太长&#xff0c;内容过多&#xff0c;并不方便笔记的整理。那有什么方法可以快速地整理好笔记呢&#xff1f;其实很简单&#xff0c;我们只需要将视频转换成文字就可以轻松…

介绍两种提取视频语音变成文字的方式

怎么提取视频语音变成文字&#xff1f;随着这些年短视频的火爆&#xff0c;越来越多的人开始拍摄了起来。而无论是vlog、美食、游戏还是科技等形式的视频&#xff0c;字幕都是必不可少的。靠手动打字录入不仅麻烦还容易输错&#xff0c;下面给各位介绍两个方便快捷的办法&#…

python实现给视频添加字幕,并根据字幕添加语音

文章目录 前言一、"pyttsx3"实现“文字到音频”的转换二、"pydub"处理音频1.安装2.测试 三、“moviepy”合成字幕和音频1.安装2.测试 总结 前言 最近尝试用python实现给一个视频添加字幕和语音&#xff0c;查了很多博客后有了一个拼拼凑凑的方法&#xff…

手把手教会你视频转文字怎么操作,快来get

由于近几年不可抗力的因素&#xff0c;许多课程以及会议都转变为线上的形式&#xff0c;那你们有没有遇到以下这几个情况&#xff1a;老师讲课的语速的过快&#xff0c;导致记知识点的速度跟不上&#xff1b;又或者是领导开会时&#xff0c;中间还夹杂着他人不同的观点&#xf…

PC端视频中语音实时转文字

PC端视频中语音实时转文字 Win系统语音功能设置 设置哪些软件可以使用麦克风 设置语音输入来源 全局设置 局部软件设置 总结 TOC PC端视频中语音实时转文字 我比较喜欢看视频来学习&#xff0c;特别是那些基础的技术&#xff0c;但是我又有做笔记的习惯&#xff0c;因此一边看…

用GPT4写2023高考语文作文,新课标I卷,Ⅱ卷

文章目录 新课标Ⅰ卷新课标Ⅱ卷总结 每年的高考语文题目都会是热议的话题&#xff0c;今年同样也不例外。但是今年讨论的话题除了作文题目本身之外&#xff0c;对于chatgpt写出的作文会是什么样子的也​让广大网友同样期待 新课标Ⅰ卷 好的故事&#xff0c;可以帮我们更好地表达…

九龙证券|沪指收获2010年以来最强1月 北向资金净买入额刷新历史纪录

昨日&#xff0c;A股小幅调整&#xff0c;2023年1月行情随之收官。全体来看&#xff0c;1月A股商场拾级而上&#xff0c;盘面出现普涨格局&#xff0c;价值与生长风格均有亮眼体现。三大股指中&#xff0c;上证指数1月上涨5.39%&#xff0c;创2010年以来最佳局面。深证成指、创…

发送邮件那些事

邮件历史 世界的第一封电子邮件 1969年10月世界上的第一封电子邮件是由计算机科学家Leonard K.教授发给他的同事的一条简短消息。 据《互联网周刊》报道世界上的第一封电子邮件是由计算机科学家Leonard K.教授发给他的同事的一条简短消息(时间应该是1969年10月)&#xff0c;…

对邮件发送系统的深刻解析(一般程序员都不一定搞的懂)

前言 在几年以前&#xff0c;相信不少朋友都听说过&#xff0c;马云同志创办阿里巴巴的时候&#xff0c;还不会发邮件。也不知道在阿里巴巴上市之后&#xff0c;他学会收发邮件了没有&#xff01;呵呵。我是曾经从内心里“瞧不起”过&#xff0c;至少认为在这一点上我比他强很多…