Activity之间传递数据的方式及常见问题总结

转载请注明:大飞 http://blog.csdn.net/rflyee/article/details/47431633

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读写嘛,其实还是比较容易出错的

转载请注明:大飞 http://blog.csdn.net/rflyee/article/details/47431633

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 13:50:57

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

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

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

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

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

android中activity之间传递数据的3种方式

在android开发中总是需要不停的传递数据,特别是不同的Activity之间.在这里小编介绍自己所知的3种Activity的跳转方式. 第一种:静态传递数据 直接上部分代码:在第一个Activity中 Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); SecondActivity.usrname = "jack"; SecondActivity.password

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

现在要做一个项目,多个Activity之间要共享数据,所以要考虑共享数据的方式. 其实有如下5种方式: 1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用. 2. 利用static静态数据,public static成员变量: 3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Pro

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

原文:http://blog.csdn.net/xueerfei008/article/details/23046341 做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符串之类的东东,结果这次卡了好久,折腾了一个下午. 第一个:传递bitmap 这个问题非常奇葩(可能我android水平还不够),居然不会报错,我是直接用bundle或Intent的extral域直接存放bitmap,结果运行时各种宕机,各种界面乱窜(我非常的纳闷)...搜索之后看大家都说不能直接传递

Android 学习之路 1:Activity之间传递数据的四种方式

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

使用全局变量在Activity之间传递数据

在Activity之间数据传递中还有一种比较实用的方式,就是全局对象,使用J2EE的读者来说都知道Java Web的四个作用域,这四个作用域从小到大分别是:Page.Request.Session和Application,其中Application域在应用程序的任何地方都可以使用和访问,除非是Web服务器停止,Android中的全局对象非常类似于Java Web中的Application域,除非是Android应用程序清除内存,否则全局对象将一直可以访问. 下面通过例子来分享一下它的实现: 建立

Android 学习之路 1:如何在Activity之间传递数据

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

【Android基础】利用Intent在Activity之间传递数据

前言: 上一篇文章给大家聊了Intent的使用方法.怎样用Intent启动Activity和隐式Intent.这一篇文章给大家聊聊怎样利用Intent在Activity之间进行沟通. 从一个Activity获取返回结果: 启动一个Activity不不过startActivity(Intent intent)一种方法.你也能够通过startActivityForResult()启动一个Activity而且在它退出的时候收到一个返回结果. 比方.你能够调用系统相机在你的应用中,拍了一张照片,然后返回