Activity 参数传递方法总结

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 参数传递方法总结

  1. 你现在做 Android 了吗?https://bbs.bccn.net/space-uid-516596.html
    这个是你吗?

回复 yuccn 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注