APP开发实战63-Activity数据传递媒介

16.4Activity数据传递

16.4.1数据传递媒介

16.4.1.1 通过Intent传递数据

(1)直接传递---intent.putExtra(key,value)

(2)通过bundle---intent.putExtras(bundle)

这两种方式都要求传递的对象必须可序列化(Parcelable或Serializable),且通过intent传递数据是有大小限制的,最好不要超过1M。

16.4.1.2 使用全局对象传递数据

在类中大量的使用静态变量(尤其是使用很占资源的变量,如Bitmap对象)可能会导致内存溢出,而且还可能因为静态变量在很多类中出现而造成代码难以维护和混乱的状况。全局对象可以完全取代静态变量。

Android中的全局对象所对应的类可以从android.app.Application继承,如:

public class MyApp extends Application{
        publicString name;

        publicData data = new Data();
    } 

在编写完全局类之后,还需要通过<application>AndroidManifext.xml中注册。

然后通过Activity.getApplicationContext()方法可以获得全局对象。
     MyApp app = (MyApp) getApplicationContext();

     app.name = "abc";
     app.data.id  = "100";

当由于某些原因(比如系统内存不足),APP会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,但此时APP的内存已经被释放,数据为空,可能会出现异常,需要特别关注此种情况。

16.4.1.3 使用单例对象传递数据

比如一种常见的写法:

publicclass DataHolder {

  private String data;

  public String getData() {return data;}

  public void setData(String data) {this.data =data;}

  private static final DataHolder holder = newDataHolder();

  public static DataHolder getInstance(){return holder;}

}

设置数据:

DataHolder.getInstance().setData(data);

在Activity中获取数据:

Stringdata = DataHolder.getInstance().getData();

16.4.1.4 使用静态变量传递数据

(1)在ActivityMan中定义如下变量:

publicstatic String Name;

在别的Activity中可以使用ActivityMan.Name这种方式获取变量的值。

 

(2)单独定义一个数据结构体,如:

publicclass DataHolder {

      privatestatic String data;

      publicstatic String getData() {return data;}

      public static String setData(String data){this.data = data;}

}

如果数据很大很多,比如bitmap,处理不当是很容易导致内存泄露或者内存溢出,可以考虑使用WeakReferences 将数据包装起来。

比如:

publicclass DataHolder {

  Map<String,WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();

 

  void save(String id, Object object) {

    data.put(id, newWeakReference<Object>(object));

  }

 

  Object retrieve(String id) {

    WeakReference<Object>objectWeakReference = data.get(id);

    return objectWeakReference.get();

  }

}

设置数据:

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

获取数据:

DataHolder.getInstance().retrieve(someId);

16.4.1.5 使用持久化方式传递数据

就是使用Sqlite、SharePreference和File等传递数据。

优点:

(1)应用中所有地方都可以访问。

(2)即使应用被强杀也不是问题了。

缺点:

(1)操作麻烦。

(2)效率低下。

16.4.1.6 使用剪切板传递数据

把数据放在一个剪切对象(Clip Object)里,然后这个对象会放在系统的剪贴板里。

  Clip Object可以有三种形式:

  (1)Text---文字字符串

  文字是直接放在Clip对象中,然后放在剪贴板里;粘贴这个字符串的时候直接从剪贴板拿到这个对象,把字符串放入应用存储中。

  (2)URI---Uri 对象

  表示任何形式的URI。这种形式主要用于从一个ContentProvider中复制复杂的数据。

  复制的时候把一个Uri 对象放在一个Clip对象中,然后再放在剪贴板里;粘贴的时候取出这个Clip对象,得到Uri,把它解析为一个数据资源比如Content Provider,然后从资源中复制数据到应用存储中。

  (3)Intent---Intent对象。

  这支持了复制应用快捷方式。

  复制的时候把Intent对象放在Clip对象中,再放入剪贴板;粘贴数据时,从Clip对象中得到Intent对象,放入应用存储区域中。

     剪贴板每次仅会持有一个Clip对象,当应用放另一个Clip对象进来时,前一个就消失了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值