Android中activity间的跳转通过Intent来实现的,而跳转的类型分为显式和隐式,两者间的区分是根据你传入Intent中参数来决定的。
显式跳转:明确知道跳转的目标Activity的包名和类名,或者根据Intent中传入的参数系统可以提取到目标Activity的包名和类名。
Intent构造函数
1. Intent( ):初始化一个空的Intent,要实现跳转其对应的setxxx方法;
2. Intent( Intent o):复制构造函数,传入的是一个Intent?有点迷,暂时没有想到在哪种需求下用到;
3. Intent( String action):根据给定的action创建intent;
4. Intent(String action , Uri uri):根据给定的action和数据url创建Intent;
5. Intent( Context packageContext, Class<?> cls ):根据传入的context和组件类(如TestActivity.class)创建Intent,开发中显示跳转较为常用的一种方式,其源码如下:
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
6. Intent( String action, Uri uri, Context packageContext, Class<?> cls ):感觉是4和5的一个结合体,源码如下:public Intent(String action, Uri uri,
Context packageContext, Class<?> cls) {
setAction(action);
mData = uri;
mComponent = new ComponentName(packageContext, cls);
}
7. Intent(Intent, boolean)用private修饰的,Intent(Parcel)用protected修饰的,其作用暂未详查。
在5、6两种构造方法的源码中都有看到mComponent = new ComponentName(packageContext, cls)这么一行代码,点进ComponentName类看一下,其有如下三种构造函数:
public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls) {
mPackage = pkg.getPackageName();//得到的是AndroidManifest.xml的package值
mClass = cls.getName();//得到的是Activity在AndroidManifest.xml中的声明值,如com.testproject.activity.Test1Activity
}
public ComponentName(@NonNull Context pkg, @NonNull String cls) {
if (cls == null) throw new NullPointerException("class name is null");
mPackage = pkg.getPackageName();
mClass = cls;
}
public ComponentName(@NonNull String pkg, @NonNull String cls) {
if (pkg == null) throw new NullPointerException("package name is null");
if (cls == null) throw new NullPointerException("class name is null");
mPackage = pkg;
mClass = cls;
}
不难看出CompontentName的主要作用,就是根据的传入的Context和Class获取对应的包名和类名,包名和类名是执行显式跳转的主要依据。
Intent中显式跳转相关的set方法
1. setClass( Context packageContext, Class<?> cls):传入context和组件类,和Intent的构造方法5相似,较常用的一种方法;
2. setClassName(Context packageContext, String className):直接传入目标类名,包名根据packageName获取;
//具体使用
private void test() {
Intent intent = new Intent();
intent.setClassName(MainActivity.this,"com.intenttest.activity.IntentTestActivity");
startActivity(intent);
}
3. setClassName(String packageName, String className):直接传入包名和类名不需要再通过get方法去获取;
//具体使用
private void test() {
Intent intent = new Intent();
intent.setClassName("com.intenttest","com.intenttest.activity.IntentTestActivity");
startActivity(intent);
}
4. setComponent( ComponentName component):最为直接的方法,传入ComponentName实例;
private void test() {
Intent intent = new Intent();
//ComponentName componentName = new ComponentName(MainActivity.this, IntentTestActivity.class);
//ComponentName componentName = new ComponentName("com.intenttest","com.intenttest.activity.IntentTestActivity");
ComponentName componentName = new ComponentName(MainActivity.this, "com.intenttest.activity.IntentTestActivity");
intent.setComponent(componentName);
startActivity(intent);
}
应用间跳转
Android中应用间页面跳转一般是用action实现的,但上面介绍的也可以实现应用间的跳转。
//intent.setClassName("com.intenttest","com.intenttest.activity.IntentTestActivity");
//ComponentName componentName = new ComponentName("com.intenttest","com.intenttest.activity.IntentTestActivity");