16.4Activity数据传递
(1)直接传递---intent.putExtra(key,value)
(2)通过bundle---intent.putExtras(bundle)
这两种方式都要求传递的对象必须可序列化(Parcelable或Serializable),且通过intent传递数据是有大小限制的,最好不要超过1M。
在类中大量的使用静态变量(尤其是使用很占资源的变量,如Bitmap对象)可能会导致内存溢出,而且还可能因为静态变量在很多类中出现而造成代码难以维护和混乱的状况。全局对象可以完全取代静态变量。
Android中的全局对象所对应的类可以从android.app.Application继承,如:
public class MyApp extends Application{
publicString name;
publicData data = new Data();
}
在编写完全局类之后,还需要通过在AndroidManifext.xml中注册。
然后通过Activity.getApplicationContext()方法可以获得全局对象。
MyApp app = (MyApp) getApplicationContext();
app.name = "abc";
app.data.id = "100";
当由于某些原因(比如系统内存不足),APP会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,但此时APP的内存已经被释放,数据为空,可能会出现异常,需要特别关注此种情况。
比如一种常见的写法:
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();
(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> data = new HashMap>();
void save(String id, Object object) {
data.put(id, newWeakReference(object));
}
Object retrieve(String id) {
WeakReferenceobjectWeakReference = data.get(id);
return objectWeakReference.get();
}
}
设置数据:
DataHolder.getInstance().save(someId,someObject);
获取数据:
DataHolder.getInstance().retrieve(someId);
就是使用Sqlite、SharePreference和File等传递数据。
优点:
(1)应用中所有地方都可以访问。
(2)即使应用被强杀也不是问题了。
缺点:
(1)操作麻烦。
(2)效率低下。
把数据放在一个剪切对象(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对象进来时,前一个就消失了。
网友评论