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。
 
三、使用单例
比如一种常见的写法:
public class DataHolder {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {return holder;}
}
这样在启动activity之前:
DataHolder.getInstance().setData(data);

新的activity中获取数据:

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

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

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

启动之前:

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

新activity中:

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. Delphi 精选文章地址

    Delphi 三层开发 ************   http://blog.csdn.net/lailai186/article/category/1396968 Delphi CxGrid 汇总 ...

  2. selenium处理rich text(富文本框)

    WordPress 的 rich  text 采用js,先让selenium切换到iframe中 driver.switchTo().frame("content_ifr"); 然 ...

  3. ACM/ICPC 之 四道MST-Prim解法(POJ1258-POJ1751-POJ2349-POJ3026)

    四道MST,适合Prim解法,也可以作为MST练习题. 题意包括在代码中. POJ1258-Agri Net 水题 //Prim-没什么好说的 //接受一个邻接矩阵,求MST //Time:0Ms M ...

  4. CSS3 -web-box-shadow实现阴影效果

    -webkit-box-shadow:2px -2px 10px #06c; 给元素添加阴影效果 text-shadow 是给文本添加阴影效果属性同上 形成的阴影跟阴影本体大小一致,四个属性分别代表 ...

  5. 【leetcode】Remove Element (easy)

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  6. 【leetcode】Next Permutation(middle)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  7. 【leetcode】Valid Sudoku (easy)

    题目:就是判断已有的数字是否冲突无效,若无效返回flase 有效返回true 不要求sudo可解 用了char型的数字,并且空格用‘.'来表示的. 思路:只要分别判断横向 竖向 3*3小块中的数字是否 ...

  8. 在没装VS2010的机器上运行VS2010开发的C++程序

    在VS2010下写了一个win32控制台应用程序,编译ok.exe,需要依赖osg相关动态库 第一次编译的是Debug版本的,直接将ok.exe和osg相关dll文件拷贝到没有安装VS2010机器上运 ...

  9. iOS开发之Xcode 相对路径与绝对路径

    iOS开发之 相对路径与绝对路径 https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/Xcod ...

  10. python基础——使用元类

    python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...