Activity 参数传递方法总结
Android 程序 Activity 启动,参数传递主要下面几种实现方式:
1 直接使用 Intent;
2 封装本地缓存 DataCache;
3 使用第三方库(比如EventBus);
4 本地持久化数据(如:Sqlite、SharedPreferences、File)。
这几种方式用法、优缺点分别做介绍。
1 直接使用 Intent
用法较为简单方便,传递方调用 Intent的 putExtra系列的接口保存,接受方通过 intent 获取到bundle,再把数据取出来。
优点:
* 简单数据类型情况,使用Intent较为方便;
* 支持跨进程传递;
* 进程切换到后台被回收后,重建Activity时候还能再次获取数据。
缺点:
* 对于自定义类型的数据,需要对数据序列化,增加了复杂度;
* Intent 传递数据是有大小限制(1M),传递过大数据时候会抛出异常(TransactionTooLargeException),可能会引起程序闪退。
2 封装本地缓存 DataCache
该方法本质是自定义全局缓存,通过缓存管理器来传递数据,这里来个实例代码:
public class DataCache {
public static final String KEY_ID = "DataCache_PARAM_ID";
@Accessors(prefix = "s") @Getter
private static DataCache sInstance = new DataCache();
private LongSparseArray<Object> mData = new LongSparseArray<>();
private long mNextId = 0;
public long add(Object data) {
long id = newId();
mData.put(id, data);
return id;
}
public Object remove(long id) {
Object o = mData.get(id);
mData.remove(id);
return o;
}
private long newId() {
return mNextId++;
}
}
用法是,调用者调用add把数据传入DataCache,获取到返回的id,再把id 放入intent内,目标Activity 通过intent 获取到id,再通过id去DataCache内把数据取出来,如下:
// 传递方
long id = DataCache.getInstance().add(value)
intent.put("id", id)
// 接收方
long id = bundle.getLong("id");
Object value = DataCache.getInstance().remove(id)
该方法常用于工程较大、较多自定义类型传递的情况。可以整理一个BaseActivity 来和 DataCache 进行数据交互,这样使用上更为方便。
优点:
* 方便传递较为复杂的数据类型;
* 没有明确的参数数据大小限制。
缺点:
* 不能跨进程传递数据;
* 进程切换到后台被回收后,Activity被重建时不能再次获取数据。
3 使用第三方库
使用第三方库,其实就是和方法2 本质是一样到,只是库做了数据缓存的封装。
这里使用 EventBus 做例子。 EventBus 的 postSticky、getStickyEvent、removeStickyEvent 结合使用能满足要求。
EventBus 本质上和 方法2 是一样的,优缺点也大体相同。
4 本地持久化数据
具体实现就是把要传递的参数写入File,或Sqlite,或SharedPreferences。
优点:
* 支持跨进程传递数据;
* 进程切换到后台被回收后,Activity被重建时还能再次获取数据。
缺点:
* 操作复杂麻烦;
* 进行本地存取数据,效率也会相对低下很多;
* 控制不好容易出错。
总之,上面几种情况,如果 Activity 之间传递的是简单的基本类型数据,而且无需封装,使用方法1 即可;数据较为复杂(参数多而数据量大),而且是同一个进程内的传递的,使用方法2、3 较为常见;在进程间传递数据拉起Activity(比如自己的 tools 进程),而且数据量较大的(比如传递List<String>,而且数据量巨大),则需要使用方法4,方法4 非必要情况下不使用为好。
(全文完)
(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn )
2 thoughts on “Activity 参数传递方法总结”
你现在做 Android 了吗?https://bbs.bccn.net/space-uid-516596.html
这个是你吗?
是的,现在较少接触Android 开发了