Android之隐式意图启动Activity(一)

本文详细介绍了Android中隐式意图启动Activity时action和category的匹配规则。强调了Intent必须包含至少一个action,并分析了category的匹配条件,包括默认category。同时,通过示例解析了正确和错误的匹配情况,以及使用隐式意图时应注意的事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

大家应该都知道,隐式意图共有三个大的匹配规则,它们分别是:action、category、data,我认为action与category的匹配规则比较像,且相对比较简单为一篇,而data匹配规则,多且复杂,所以将它单列一篇。

action的匹配规则

  • 如果是隐式意图启动Activity,那么Intent中必须至少有一个action;
  • Intent中的action必须能够与过滤规则中的action完全匹配,这里的匹配是指完全一样;
  • 过滤规则中可以有多个action,只有Intent中的action都能够与过滤规则中的action完全匹配,才能匹配成功,否则均视为失败。

category的匹配规则

  • Intent中可以没有category,当Intent中没有category时,startActivity()会在Intent中默认添加一个category(“android.intent.category.DEFAULT”);
  • 如果Intent中有category,那么它必须是过滤规则中声明过了,且所有的category必须都是过滤规则中的category。

下面贴几个正确的例子和错误的例子

FirstActivity在manifest文件中声明的代码如下:

        <activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="com.itlong.myimplicitintent.FIRSTACTIVITY"/>
                <action android:name="com.itlong.myimplicitintent.TEST"/>


                <category android:name="com.itlong.myimplicitintent.MYCATEGORY"/>
                <category android:name="com.itlong.myimplicitintent.TESTCATEGORY"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
  • 只有action,没有category,成功启动activity,分为Intent中只有一个action,和有两个action;
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.TEST");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.setAction ("com.itlong.myimplicitintent.TEST");
        startActivity (intent);
  • 只有action,没有category,启动activity失败,分为Intent中只有一个action且是错误的,有两个action且有其中一个action是错误的,有两个action且两个都是错误的;如果你启动成功了,说明手机里面有声明了这里给出错误的action的Activity;
        Intent intent = new Intent ("com.itlong.myimplicitintent.FRSTACTIVITY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.TEXT");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.setAction ("com.itlong.myimplicitintent.TEXT");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FRSTACTIVITY");
        intent.setAction ("com.itlong.myimplicitintent.TEST");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FRSTACTIVITY");
        intent.setAction ("com.itlong.myimplicitintent.TEXT");
        startActivity (intent);
  • 既有action,又有category,action的情况已说清楚,这里action是“com.itlong.myimplicitintent.FIRSTACTIVITY”常量,只分析category的情况,可以分为只添加一个category,添加了两个category,成功启动Activity。
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.MYCATEGORY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.TESTCATEGORY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.MYCATEGORY");
        intent.addCategory ("com.itlong.myimplicitintent.TESTCATEGORY");
        startActivity (intent);
  • 既有action,又有category,action的情况已说清楚,这里action是“com.itlong.myimplicitintent.FIRSTACTIVITY”常量,只分析category的情况,可以分为只添加一个category且是错误的,添加了两个category其中一个是错误的,添加两个category两个都是错误的,启动Activity失败。
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.MCATEGORY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.TEXTCATEGORY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.MCATEGORY");
        intent.addCategory ("com.itlong.myimplicitintent.TESTCATEGORY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.MYCATEGORY");
        intent.addCategory ("com.itlong.myimplicitintent.TEXTCATEGORY");
        startActivity (intent);
        Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
        intent.addCategory ("com.itlong.myimplicitintent.MCATEGORY");
        intent.addCategory ("com.itlong.myimplicitintent.TEXTCATEGORY");
        startActivity (intent);

注意事项及总结

  • 使用隐式意图启动Activity时,Intent对象必须包含至少一个action;
  • 使用饮隐式意图启动Activity时,该Activity在manifest文件中声明时,必须添加默认的category,否则会报错
  • 我自己总结就是action与category过滤方式是一样的,只不过隐式意图启动时,Intent对象中action是至少要有一个,category是可有可无的,当没有category时其实是系统内部帮我们添加了一个默认的category。
  • action与category的匹配是一样区分大小写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值