问题分析
- 或许大家看到标题Android界面跳转会觉得这个有什么好说的呢,无非就是使用startActivity(_this,_class) 和 Intent 的putExtra()来传递参数么!对,就是这么简单。
- but,大家有没想过当界面需要不断的跳转和带多个参数的时候使用Intent的putExtra()会显得很乱,更重要的是从 Intent 中取数据的时候需要格外小心——类型要对应,key 要写对,不然轻则取不到数据,重则 Crash。还有一点,就是当前 Activity/Fragment 必须要知道目标 Activity 的类名,这里耦合的很严重,有没有。当时就在想这是不是应该封装一下啊,或者有更好的解决方案。
方案(一)
- 在utils包里面创建一个统一管理界面跳转的单模式
- 在OpenActManager中创建intent实现跳转
- 传递数据使用序列化(Parcelable)对象来实现,创建一个实体类继承Parcelable接口,将传递的字段存放在该类中,方便获取和调用,再也不需要去找对应的key来获取参数。
private final String OPEN_ACTIVITY_KEY = "open_activity_key";
/**
* 获取上一个界面传递过来的参数
*
* @param activity this
* @param 泛型
* @return
*/
public T getParcelableExtra(Activity activity) {
Parcelable parcelable = activity.getIntent().getParcelableExtra(OPEN_ACTIVITY_KEY);
activity = null;
return (T) parcelable;
}
/**
* 启动一个Activity
* @param _this
* @param _class
* @param flags
* @param parcelable 传递的实体类
*/
public void goActivity(Context _this, Class _class, int flags, Parcelable parcelable) {
intent.setClass(_this, _class);
setFlags(flags);
putParcelable(parcelable);
_this.startActivity(intent);
_this = null;
}
使用方式:
public int id;
public String name;
public ArrayList data;
StartActTransfer transfer = new StartActTransfer(10, "deng", new ArrayList());
OpenActManager.get().goActivity(this, SecondActivity.class, transfer);
StartActTransfer startActTransfer = OpenActManager.get().getParcelableExtra(this);
if(startActTransfer!=null){
int id = startActTransfer.id;
String name = startActTransfer.name;
ArrayList data = startActTransfer.data;
LogHelper.e("id:"+id+" "+"name:"+name);
}
完整例子代码 github
方案(二)
- 使用Android路由表框架
- www.sixwolf.net/blog/2016/0…
我们都是站在巨人的肩膀上
参考:
www.jianshu.com/p/0590f530c…
www.sixwolf.net/blog/2016/0…