显示启动
构造方法传入Component,最常用的方式
setComponent(componentName)方法
setClass/setClassName方法
1、跳转Activity,可以直接显示调用,如下所示:
startActivity(new Intent(this,DemoActivity.class));
// Service的显式启动类似:startService(new Intent(this,DemoService.class));
2、如果要调用不是自己应用的Activity,或者跳转的Activity是动态变化的,就可以使用包名+类名的方式显示调用,如下所示:
Intent intent = new Intent(); // 跳转到Activity:包名+类名
intent.setClassName("包名","类名");
startActivity(intent);
但是如果目标Activity不存在岂不是很尴尬,所以需要判断目标Activity是否存在:
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(intent, 0);
if (resolveInfos != null && resolveInfos.size() > 0) {
// 存在此类名才跳转
}
最后,包名+类名的方式显示调用实战代码如下:
Intent intent = new Intent();
intent.setClassName(getPackageName(), SPUtils.getInstance().getString(GlobalVar.SP_ATTR1_JUMPV_VIEW)); // 跳转到Activity:包名+类名
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(intent, 0);
if (resolveInfos != null && resolveInfos.size() > 0) { // 存在此类名才跳转
startActivity(intent);
}
隐式启动
通过在AndroidManifest文件中设置action、data、category,让系统来筛选出合适的Activity。
action的匹配规则
Intent-filter action可以设置多条
intent中的action只要与intent-filter其中的一条匹配成功即可,且intent中action最多只有一条 Intent-filter内必须至少包含一个action
category的匹配规则
Intent-filter内必须至少包含一个category,android:name为android.intent.category.DEFAULT
intent-filter中,category可以有多条
intent中,category也可以有多条 intent中所有的category都可以在intent-filter中找到一样的(包括大小写)才算匹配成功
data的匹配规则
intent-filter中可以设置多个data
intent中只能设置一个data
intent-filter中指定了data,intent中就要指定其中的一个data
1、隐式启动,如下所示:
startActivity(new Intent("约定好的action名"));
// Service的隐式启动类似:startService(new Intent("约定好的action名"));
2、 有时候和同事协同开发,对方想访问我其中的某个页面,就可以使用如下隐式调用方式:
前提:双方约定好action名,以及传参TAG等。
public static void openOtherActivity(Context context,int categoryId) {
Intent intent = new Intent("约定好的action名");
List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfos != null && resolveInfos .size() > 0) {
intent.putExtra("传参TAG", categoryId);
context.startActivity(intent);
} else {
Toast.makeText(context, "not found", Toast.LENGTH_SHORT).show();
}
}