启动Activity的方式

显示启动

        构造方法传入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();
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值