一、隐式意图介绍

显式意图我们前面已经提到,形如:

Intent intent = new Intent();

intent.setClass(this,Other.class);//此句表示显式意图,因为明确设置激活对象为Other类

startActivity(intent);

顾名思义,隐式意图就是在不明确设置激活对象的前提下寻找最匹配的组件,举个例子,比如有5个人:

(1)A:170cm

(2)B:160cm

(3)C:180cm

(4)D:190cm

(5)E:200cm

如果是显示意图的话,如果我们要指明选择A的话会说:”我选择A.“,但是如果是隐式意图,则会说:”我要选择170cm的人“,虽然没有指明要选A,但会寻找条件最匹配的人。

在intent过滤器中类似于上面例子中的”身高“条件的匹配条件有:

(1)action

(2)category

(3)data:scheme、host、path、type

当在程序中设置了这些激活组件的条件,程序就会去寻找最匹配的组件,但是注意:只要有一点不匹配,则就是不匹配;

比如:

Intent intent = new Intent();

intent.setAction("a");//此句只是指定了Action

startActivity(intent);//寻找最匹配的组件激活,内部会调用intent.addCategory("android.intent.category.DEFAULT");

二、隐式Intent的核心代码

首先是在AndroidManifest.xml中为某个Activity设置意图过滤器:

[html] view
plain
copy

  1. <activity>
  2. <intent-filter>
  3. <action android:name="...."/>
  4. <category android:name="...."/>
  5. <category android:name="android.intent.category.DEFAULT"/>    <!--此句一般都要加 -->
  6. <data android:scheme="..." android:host="..." android:path="/..." android:type="..."/>
  7. </intent-filter>
  8. </activity>

以上设置是设置Activity本身的属性,接下来在程序中要设置的是我们要寻找时匹配的条件:

(1)Intent intent = new Intent();

(2)intent.setAction("....");

(3)intent.addCategory("....");

(4)intent.setData(Uri.parse("...."));//设置data的scheme、host、path条件

(5)intent.setDataAndType(Uri.parse(""),String type);//同时设置data的scheme、host、path、type条件

(6)startActivity(intent);//调用intent.addCategory("android.intent.category.DEFAULT");

三、代码举例



场景介绍:在MainActivity中有一个按钮,点击按钮后,会进行隐式Intent匹配,最后寻找到并激活OtherActivity.

情况1:

[html] view
plain
copy

  1. <activity
  2. android:name=".OtherActivity"
  3. android:label="OtherActivity" >
  4. <intent-filter>
  5. <action android:name="com.xiazdong.action" />
  6. <category android:name="android.intent.category.DEFAULT" />
  7. <category android:name="com.xiazdong.category" />
  8. <data
  9. android:host="www.xiazdong.com"
  10. android:scheme="xiazdong"/>
  11. </intent-filter>
  12. </activity>

则代码为:

[java] view
plain
copy

  1. Intent intent = new Intent();
  2. intent.setAction("com.xiazdong.action");
  3. intent.addCategory("com.xiazdong.category");
  4. intent.setData(Uri.parse("xiazdong://www.xiazdong.com/xia"));
  5. startActivity(intent);      //此方法中调用intent.addCategory("android.intent.category.DEFAULT");

情况2:



在<data>中多了一个android:mimeType="text/*",此时不能使用intent.setData,而要使用intent.setDataAndType();

[html] view
plain
copy

  1. <activity
  2. android:name=".OtherActivity"
  3. android:label="OtherActivity" >
  4. <intent-filter>
  5. <action android:name="com.xiazdong.action" />
  6. <category android:name="android.intent.category.DEFAULT" />
  7. <category android:name="com.xiazdong.category" />
  8. <data
  9. android:host="www.xiazdong.com"
  10. android:scheme="xiazdong" android:mimeType="text/*"/>
  11. </intent-filter>
  12. </activity>

代码为:

[java] view
plain
copy

  1. Intent intent = new Intent();
  2. intent.setAction("com.xiazdong.action");
  3. intent.addCategory("com.xiazdong.category");
  4. intent.setDataAndType(Uri.parse("xiazdong://www.xiazdong.com"),"text/*");

android addCategory()等说明的更多相关文章

  1. android通过webview调起支付宝app支付

    webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带 ...

  2. Android:让WebView支持<input type=”file”…>元素

    最近在做一个活动页面:用户上传一张图片进行缩放.旋转后点击下一步填写内容后生成图片! 做好后经过各种测试是没有问题的,基本没有什么明显BUG,流程都能走通,但是嵌入到APP后,问题就来了! 在IOS上 ...

  3. android Intent介绍

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...

  4. Android开发案例 - 欢迎界面

    本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个Application的生命周期里, 它只会出现在第一次进入应用时, 即便按回退键到桌面之后. 使用该类启动界面的应用还有: ...

  5. android 关闭多个或指定activity

    打开了.activityA,B,C,D,...然后到E一起关闭前面所有activity(转自:http://blog.csdn.net/lengguoxing/article/details/4214 ...

  6. Android开发之应用程序的安装

    这里介绍的是用XUtils下载apk文件,然后进行安装. 首先用HttpUtils下载文件(记得获取SD卡的读写权限和联网的权限): /** * 下载Apk */ private void downL ...

  7. Android 系统工具类SystemUtils

    包含的功能有: 获取系统中所有APP应用.获取用户安装的APP应用.根据包名和Activity启动类查询应用信息.跳转到WIFI设置.WIFI网络开关.移动网络开关.GPS开关 当前若关则打开 当前若 ...

  8. Android基础学习第三篇—Intent的用法

    写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...

  9. Android 如何判断一个应用在运行(转)

    Android 如何判断一个应用在运行  在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...

随机推荐

  1. vscode设置出错, 无法自动补全

    问题: 之前设置的没问题, vscode重装后, 发现vscode里面的设置还在, 但敲代码却无法识别虚拟环境中的包了, 因此相关的内容也无法自动补全. 解决: 后来发现, 实际上设置没有出错, 但重 ...

  2. 【转】操作系统 gdt ldt

    GDT的由来:     在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table). 为什么要有GDT?我们首先考虑一下在Real Mo ...

  3. Hive优化案例

    1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...

  4. [LeetCode] Parse Lisp Expression 解析Lisp表达式

    You are given a string expression representing a Lisp-like expression to return the integer value of ...

  5. 对于IO流的个人理解

    Samuel 2018-04-21 在这之前,我给你们构造这样一个生活用水的场景: 人们日常生活需要生活用水,那么,水从哪里来呢? 大家都学过初中的物理常识,水在地表,通过蒸发,变成水蒸气去到空中,在 ...

  6. SRM 558 SurroundingGame

    题意: 给定一个网格,每个网格有选取代价和占据收益.每个点被占据,需要满足以下两个条件至少一个条件:1.被选取  2.邻近方格都被选取(有公共边被称为邻近)  不一定要占据所有方格,求最大收益. 输入 ...

  7. LGTB 与大数

    LGTB 有一个非常大的数,并且他想对它进行Q 次操作 每次操作是把这个大数中的某种数字全部替换成一个数字串 他想知道Q 次操作之后得到的数对1000000007(109 + 7) 取模的结果,请输出 ...

  8. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)

    Time Limit: 10 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...

  9. UVA129 —— Krypton Factor (氪因素)

    Input and Output In order to provide the Quiz Master with a potentially unlimited source of question ...

  10. bzoj3309DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1240  Solved: 777[Submit][Statu ...