• 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都没有配置;那么,在激活的时候,就可以根据需求使用不同的方式去激活。
  • 相关阅读:
    Linux内核参数信息(Oracle相关)
    Android和java平台 DES加密解密互通程序及其不能互通的原因
    [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
    理解 Thread.Sleep 函数
    引导加载程序:GRUB
    xvfb 初步探究
    [置顶] 中国象棋程序的设计与实现(原始版)(包含源码)
    Ext图表的精彩
    JSTL解析——004——core标签库03
    Servlet API中文版
  • 原文地址:https://www.cnblogs.com/io1024/p/11550410.html
Copyright © 2020-2023  润新知