Android的显示意图和隐式意图总结

显示意图

简而言之:

通过指定特定Activity的包名和类名开启Activity

应用场景:

一般应用于本App内的activity间的跳转。

XML配置信息:
AndroidManifest.xml

        <!--显示意图:举例-->
        <activity
            android:name=".activity.intent.IntentOneActivity"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan" />

开启方式:

    //显示意图激活的四种可用方式
    private void jumpOne() {
        //方式一:快捷方式(推荐,常用)
        Intent intent = new Intent(this, IntentTwoActivity.class);

//        //方式二:面向组件
//        Intent intent = new Intent();
//        ComponentName cn = new ComponentName(this, IntentTwoActivity.class);
//        intent.setComponent(cn);

//        //方式三:设置Class方式
//        Intent intent = new Intent();
//        intent.setClass(this, IntentTwoActivity.class);

//        //方式四:设置ClassName方式(有两种参数方式;传入全类名(完整包名+类名))
//        Intent intent = new Intent();
//        //intent.setClassName(this, "包名.activity.intent.IntentOneActivity");
//        intent.setClassName("包名", "包名.activity.intent.IntentOneActivity");

        startActivity(intent);
    }


隐式意图

简而言之:

通过指定一组动作或数据开启一个Activity

应用场景:

  1. 开启系统应用的某个界面(如:打电话、发短信、浏览器等)
  2. 开启某个应用的某个界面(需要对方应用提供其隐式配置信息)
  3. 也可以用于自身应用界面的跳转(显示意图更方便)

隐式意图配置和使用有多种情况


1️⃣配置与使用方式 一

  • AndroidManifest.xml
        <!--隐式意图的配置声明 -->
        <activity android:name=".activity.intent.IntentTwoActivity">

           <!--配置1:只配置了action和category-->
            <intent-filter>
                <!-- 默认的一种规范:全类名(包名+类名) -->
                <action android:name="包名.activity.intent.IntentTwoActivity" />
                <!--默认的一个category(必不可少)-->
                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

            <!--配置2:mimeType-->
            <intent-filter>
                <action android:name="包名.myName" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.AA" />

                <data android:mimeType="ab/cd3" />
            </intent-filter>

            <!--配置3:只有scheme有值-->
            <intent-filter>
                <action android:name="xx.xxx.xxx.xxx" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.aa" />

                <data android:scheme="abc" />
            </intent-filter>

            <!--配置4:mimeType和scheme 有值-->
            <intent-filter>
                <action android:name="wo.shi.yi.ge.action" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="xx.xxx.aa.bb" />

                <data
                    android:mimeType="a/b"
                    android:scheme="home" />
            </intent-filter>

        </activity>
  • 自身应用内使用隐式意图激活
    • 匹配:(上述)配置1
        Intent intent = new Intent(); //创建意图对象
        //为意图设置 action(动作)
        intent.setAction("包名.activity.intent.IntentTwoActivity");
        //为意图添加 category(类别)
        //category可以省略不加,intent 会默认为:"android.intent.category.DEFAULT"
        //intent.addCategory("android.intent.category.DEFAULT");
        startActivity(intent);
    • 匹配:(上述)配置2
        Intent intent = new Intent();
        intent.setAction("包名.myName");
        intent.addCategory("android.intent.category.AA");
        intent.setType("ab/cd3");
        startActivity(intent);
    • 匹配:(上述)配置3
        Intent intent = new Intent();
        intent.setAction("xx.xxx.xxx.xxx");
        intent.addCategory("android.intent.category.aa");
        intent.setData(Uri.parse("abc:"));
        startActivity(intent);
    • 匹配:(上述)配置4
        Intent intent = new Intent();
        intent.setAction("wo.shi.yi.ge.action");
        intent.addCategory("xx.xxx.aa.bb");
        intent.setDataAndType(Uri.parse("home:"), "a/b");
        startActivity(intent);

2️⃣配置与使用方式 二

  • AndroidManifest.xml
    intent-filter 多匹配规则:当有多个 action,多个category,多个data,只需要匹配一组即可!
        <!--隐式意图的配置声明 -->
        <activity android:name=".activity.intent.IntentTwoActivity">
            <intent-filter>
                <!-- action name:内容可以任意定义 -->
                <action android:name="包名.activity.intent.IntentTwoActivity" />
                <action android:name="包名.myName" />
                <action android:name="xx.xxx.xxx.xxx" />
                <action android:name="wo.shi.yi.ge.action" />
                <!--默认的一个category(必不可少),还可以自定义其他的-->
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.AA" />
                <category android:name="android.intent.category.aa" />
                <category android:name="xx.xxx.aa.bb" />
                <!--定义意图的:约束和数据-->
                <data android:mimeType="ab/cd3" />
                <data android:scheme="abc" />
                <data
                    android:mimeType="a/b"
                    android:scheme="home" />
            </intent-filter>
        </activity>
  • 自身应用内使用隐式意图激活
    • 匹配:(上述)配置
      注意: 的配置数据里面,有的匹配规则只配置了:mimeType,有的只配置了:scheme,有的配置了:mimeType和scheme,那么在激活设置的时候必须使用:setDataAndType()方法,参数内可以匹配任意的:scheme和mimeType的数据!
        Intent intent = new Intent();
        intent.setAction("wo.shi.yi.ge.action");
        intent.addCategory("xx.xxx.aa.bb");
        intent.setDataAndType(Uri.parse("abc:"), "ab/cd3");
        startActivity(intent);

两个应用之间如何激活?

以上述:配置与使用方式 二 为匹配规则,在其他应用内激活本应用的指定的某个activity(此处以:IntentTwoActivity 为例)
::使用 kotlin 代码来实践说明

代码如示:

        //action 和 addCategory 匹配配置里面的任意一个就可以
        //addCategory可以不传值,intent会默认传递:android.intent.category.DEFAULT
        val intent = Intent()
        intent.action = "包名.activity.intent.IntentTwoActivity"
        intent.`package` = "包名"
        intent.addCategory("android.intent.category.AA")
        //错误
        //intent.data = Uri.parse("home:")
        //intent.type = "ab/cd3"
        //正确
        intent.setDataAndType(Uri.parse("home:"), "ab/cd3")
        startActivity(intent)

隐式意图使用特别注意点:

  1. setType()和setData不能同时存在,两个方法会相互清空对方的设置。若同时使用,会抛出异常!若需要同时设置类型和数据,可以使用setDataAndType()方法!
  1. 若AndroidManifest中意图配置中只配置了:android:mimeType,那么只能且必须使用setType()方法,不能使用setDataAndType()方法!
  1. 若AndroidManifest中意图配置中只配置了:android:scheme,那么只能且必须使用setData()方法,不能使用setDataAndType()方法!
  1. 若AndroidManifest中意图配置中配置了:android:mimeType和android:scheme,那么只能且必须使用setDataAndType()方法!

注意一个坑: 下面的两个方法,参数里面的 ' : ' (就是这个冒号)千万!千万!不要忘记了~ (你懂的,说多了都是泪,我之前就是没注意,然后Debug了好久,让我记忆深刻啊!)
setData(Uri.parse("xx:"))
setDataAndType(Uri.parse("xx:"), "xx/xx")

intent-filter多种匹配规则:需要注意如下

  • 多匹配规则 配置在同一个...

    • 如(上述):配置与使用方式 二,该情况下必须使用setDataAndType()方法设置数据,不能省略!
  • 多匹配规则 配置在不同的...

    • 如(上述):配置与使用方式 一,配置数据里有多种匹配规则,有的配置了mimeType,有的配置了scheme,有的配置了mimeType和scheme,还有的mimeType和scheme都没有配置;那么,在激活的时候,就可以根据需求使用不同的方式去激活。
原文地址:https://www.cnblogs.com/io1024/p/11550410.html