Activity之间传递数据一般通过以下几种方式实现:
1. 通过intent传递数据
2. 通过Application
3. 使用单例
4. 静态成员变量。(可以考虑 WeakReferences
5. 持久化(sqlite、share preference、file等)
 
一、通过intent传递数据
(1)直接传递,intent.putExtra(key, value)
(2)通过bundle,intent.putExtras(bundle);
TL:
(1)这两种都要求传递的对象必须可序列化(Parcelable、Serializable)
(2)Parcelable实现相对复杂
(3)关于Parcelable和Serializable,官方说法:
        Serializable: it's error prone and horribly slow. So in general: stay away from Serializable if possible.
     也就是说和Parcelable相比,Seriaizable容易出错并且速度相当慢。是否这样,可参见下一篇博客说明。

(4)通过intent传递数据是有大小限制滴,超过限制,要么抛异常,要么新的Activity启动失败,所以还是很严重的啊,可参见下一篇博客说明。

 
二、Application
   这个应该也都接触过,将数据保存早全局Application中,随整个应用的存在而存在,这样很多地方都能访问。具体使用就不多说了。
但是需要注意的是:
  当由于某些原因(比如系统内存不足),我们的app会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,制造一种从来没有被杀死的假象。那么问题来了,系统强制停止了应用,进程死了,那么再次启动时Application自然新的,那里边的数据自然木有啦,如果直接使用很可能报空指针或者其他错误。
  因此还是要考虑好这种情况的:
  (1)使用时一定要做好非空判断
  (2)如果数据为空,可以考虑逻辑上让应用直接返回到最初的activity,比如用 FLAG_ACTIVITY_CLEAR_TASK 或者 BroadcastReceiver 杀掉其他的activity。
 
三、使用单例
比如一种常见的写法:
  1. public class DataHolder {
  2. private String data;
  3. public String getData() {return data;}
  4. public void setData(String data) {this.data = data;}
  5. private static final DataHolder holder = new DataHolder();
  6. public static DataHolder getInstance() {return holder;}
  7. }
这样在启动activity之前:
  1. DataHolder.getInstance().setData(data);

新的activity中获取数据:

  1. String data = DataHolder.getInstance().getData();
四、静态Statis
这个可以直接在activity中也可以单独一个数据结构体,就和单例差不多了。
比如:
  1. public class DataHolder {
  2. private static String data;
  3. public static String getData() {return data;}
  4. public static String setData(String data) {this.data = data;}
  5. }

启动之前设置数据,新的activity获取数据。

 
注意:这些情况如果数据很大很多,比如bitmap,处理不当是很容易导致内存泄露或者内存溢出的。
所以可以考虑使用WeakReferences 将数据包装起来。
比如:
  1. public class DataHolder {
  2. Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();
  3. void save(String id, Object object) {
  4. data.put(id, new WeakReference<Object>(object));
  5. }
  6. Object retrieve(String id) {
  7. WeakReference<Object> objectWeakReference = data.get(id);
  8. return objectWeakReference.get();
  9. }
  10. }

启动之前:

  1. DataHolder.getInstance().save(someId, someObject);

新activity中:

  1. DataHolder.getInstance().retrieve(someId);

这里可能需要通过intent传递id,如果数据唯一,id都可以不传递的。save() retrieve()中id都固定即可。

 
五、持久化数据
那就是sqlite、share preference、file等了。
优点:
(1)应用中所有地方都可以访问
(2)即使应用被强杀也不是问题了
缺点:
(1)操作麻烦
(2)效率低下
(3)io读写嘛,其实还是比较容易出错的
 

Activity之间传递数据的方式及常见问题总结的更多相关文章

  1. 【Android 复习】 : Activity之间传递数据的几种方式

    在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...

  2. 在activity之间传递数据

    在activity之间传递数据 一.简介 二.通过intent传递数据 1.在需要传数据的界面调用 intent.putExtra("data1", "我是fry&quo ...

  3. Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口

    package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...

  4. 28、activity之间传递数据&批量传递数据

    import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android ...

  5. Android 笔记-Fragment 与 Activity之间传递数据

    Fragment 与 Activity之间传递数据有两种方法.一种是使用setArgument,一种是使用接口回调.以下先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这 ...

  6. 多个Activity之间共享数据的方式

    现在要做一个项目,多个Activity之间要共享数据,所以要考虑共享数据的方式. 其实有如下5种方式: 1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到 ...

  7. Android基础 -- Activity之间传递数据(bitmap和map对象)

    原文:http://blog.csdn.net/xueerfei008/article/details/23046341 做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符 ...

  8. servlet之间传递数据的方式

    Servlet传递数据方式 基本概述 Servlet传递数据的方式有很多,这里提供五种方式: 1.静态变量 2.HttpServletResponse的sendRedirect()方法 3.HttpS ...

  9. android中使用Intent在activity之间传递数据

    android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...

随机推荐

  1. C#获取IP和主机名

    System.Net.IPAddress addr; //获取IP addr = new System.Net.IPAddress ( Dns.GetHostByName ( Dns.GetHostN ...

  2. SQL Server遍历表的几种方法 转载

    SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...

  3. 【leetcode】 Unique Path ||(easy)

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  4. iOS-JavaScript向WKWebView传值

    一.本地代码所需操作 1.创建viewController并遵守协议 @interface ViewController ()<WKNavigationDelegate,WKScriptMess ...

  5. PHP如何判断远程图片文件是否存在

    <?php $url = 'http://www.nowamagic.net/images/test.jpg'; if( @fopen( $url, 'r' ) ) { echo 'File E ...

  6. 如何用Endnote导入你要用的格式

    在Google搜索某一个期刊名 ens格式的文件,下载,然后放入endnote的文件夹中(C:\Program Files (x86)\EndNote X7\Styles) 然后将其导入即可

  7. rabbitmq_config

    https://github.com/rabbitmq/rabbitmq-server/blob/stable/docs/rabbitmq.config.example   %% ---------- ...

  8. HTTP长连接和短连接原理浅析

    原文出自:HTTP长连接和短连接原理浅析

  9. hadoop2.x NameNode 的共享存储实现

    过去几年中 Hadoop 社区涌现过很多的 NameNode 共享存储方案, 比如 shared NAS+NFS.BookKeeper.BackupNode 和 QJM(Quorum Journal ...

  10. Hadoop CDH5 集群管理

    Hadoop 是一个开源项目,所以很多公司在这个基础进行商业化,Cloudera 对 Hadoop做了相应的改变.Cloudera 公司的发行版,我们将该版本称为 CDH(Cloudera Distr ...