启动Activity的方式

显示启动

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();
    }
}
发布了55 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Agg_bin/article/details/90486145
今日推荐