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

转载:大飞 http://blog.csdn.net/rflyee/article/details/47431633html

Activity之间传递数据通常经过如下几种方式实现:
1. 经过intent传递数据
2. 经过Application
3. 使用单例
4. 静态成员变量。(能够考虑  WeakReferences
5. 持久化(sqlite、share preference、file等)
 
1、经过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启动失败,因此仍是很严重的啊,可参见下一篇博客说明。android

 
2、Application
   这个应该也都接触过,将数据保存早全局Application中,随整个应用的存在而存在,这样不少地方都能访问。具体使用就很少说了。
可是须要 注意的是:
  当因为某些缘由(好比系统内存不足),咱们的app会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,制造一种历来没有被杀死的假象。那么问题来了,系统强制中止了应用,进程死了,那么再次启动时Application天然新的,那里边的数据天然木有啦,若是直接使用极可能报空指针或者其余错误。
  所以仍是要考虑好这种状况的:
  (1)使用时必定要作好非空判断
  (2)若是数据为空,能够考虑逻辑上让应用直接返回到最初的activity,好比用  FLAG_ACTIVITY_CLEAR_TASK 或者  BroadcastReceiver 杀掉其余的activity。
 
3、使用单例
好比一种常见的写法:
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();
4、静态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都固定便可。
 
5、持久化数据
那就是sqlite、share preference、file等了。
优势:
(1)应用中全部地方均可以访问
(2)即便应用被强杀也不是问题了
缺点:
(1)操做麻烦
(2)效率低下
(3)io读写嘛,其实仍是比较容易出错的
相关文章
相关标签/搜索