显示启动
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);
}
隐式启动
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();
}
}