【为了方便起见,以下把被启动的Activity称为toActivity,把启动Activity的Activity称为fromActivity(有点绕口)】
启动Activity是通过这个方法(java术语:方法)实现的:
public void startActivity(Intent intent)
而指明是从哪个activity启动哪个activity则是这个intent的事情了。
一般传给toActivity的intent的构造函数长这样:
Intent(Context packageContext, Class<?> cls)
简单来说就是一个(我也不知道功能的)context和一个目标类。
一般这个packageContext会使用getActivity()
来取得。
而cls则由目标类.class
来得到。
所以最简单的启动方式是这样的:
startActivity(new Intent(getActivity(), toActivity.class));
然而经常会需要传递一些信息给toActivity,这个时候就要往intent里面放入一些附加信息。
这些extra信息是以键值对的形式存储的,即一个键对应一个值。键是String类型,值的话什么都可以。
在将extra信息放入intent的时候使用一个统一的方法:
intent.putExtra(KEY, value);
由于取出的时候不同的类型所用的方法不同,如果选择在FromActivity里面往intent中放入额外信息,由于放入的时候需要KEY,取出的时候也需要KEY,这就意味着要么在fromActivity里面编入toActivity的内容(比如KEY),这显然是不大合适的,所以一般会把生成intent的任务交给toActivity。
在toActivity里面加入如下代码:
private static final String KEY="com.companyname.appname.keyname";
public static Intent newIntent(Context packageContext, Value value)//这里指的是值的类型和值
{
Intent intent = new Intent(packageContext, toActivity.class);
intent.putExtra(KEY, value);
return intent;
}
就可以直接在fromActivity里面调用这个静态方法以取得intent了。
toActivity得到intent之后,还需要把里面的额外信息拿出来才行,不然干嘛要放进去?
拿出来的时候的方法取决于放入的是值的类型。
如果是一个类:
//因为在intent中(应该)是以(Bundle中的)泛型储存的
//所以需要进行强制类型转换
//其他具体类型的就不需要转换了
Value value = (Value) getIntent().getSerializableExtra(KEY);
如果是int:getIntExtra(...)
如果是int数组:getIntArrayExtra(...)
符合这个格式的还有:byte, short, long, float, double, boolean, char, String
值得注意的是有一个特殊的方法:getIntegerExtra(...)
此外还有关于Parcelable的,此处不详述。