启动那个Acitivity有两种方式:implicit(隐藏) intent 和 explicit(明确) intent

Explicit Intent

明确的指定了要启动的Acitivity
比如以下Java代码,明确指定了要启动B:
Intent intent= new Intent(this, B.class)

Implicit Intent

没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

当使用startActivity时,隐式Intent解析到一个单一的Activity。如果存在多个Activity都有能力在特定的数据上执行给定的动作的话,Android会从这些中选择最好的进行启动。

Implicit Intent 到底发给哪个activity?

这需要进行三个匹配,一个是action,一个是category,一个是data。根据三个的匹配结果,找到应该启动的Activity。

Action Implicit Intent

动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。

一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。

<intent-filter>元素中可以包括子元素<action>,比如:
<intent-filter>
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。

Category Implicit Intent

种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。

<intent-filter>元素可以包含<category>子元素,比如:
<intent-filter . . . >
<category android:name=”android.Intent.Category.DEFAULT” />
<category android:name=”android.Intent.Category.BROWSABLE” />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。

Data Implicit Intent

Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。

  • mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。
  • scheme是URI部分的协议——例如,http:,mailto:,tel:。
  • host-name或“data authority”是介于URI中scheme和path之间的部分(例如,www.google.com)。匹配主机名时,Intent Filter的scheme也必须通过匹配。
  • 数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。

数据在<intent-filter>中的描述如下:
<intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。

解析出来后的处理逻辑

如果这个过程中多于一个组件解析出来的话,它们会以优先度来排序,可以在Android Intent Filter的节点里添加一个可选的标签。最高等级的组件会返回。

Android本地的应用程序组件和第三方应用程序一样,都是Intent解析过程中的一部分。它们没有更高的优先度,可以被新的Activity完全的代替,这些新的Activity宣告自己的Intent Filter能响应相同的动作请求。

应用程序的启动

AndroidManifest.xml 文件中,把那个 activity 配置了 <action android:name="android.intent.action.MAIN" /> ,那就就是最先被启动的 Activity ,如果多个设置了,则第一个设置的是最新被启动的 Activity。

如下图设置,是 .SplashActivity 先启动的

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ghj1976.HelloWorld" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloWorldActivity" android:label="@string/app_name">
</activity>
<activity android:name=".SplashActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

上面代码中的

activity android:name:  activity 的类名,必须有。

android.intent.action.MAIN   决定应用程序最先启动的Activity

android.intent.category.LAUNCHER     决定应用程序是否显示在程序列表里

implicit(隐藏) intent 和 explicit(明确) intent相关推荐

  1. 显示Intent和隐式Intent

    转载自:https://www.cnblogs.com/liaojie970/p/5827433.html Intent是Android初学者比较难理解的一个东西.我这里以通俗易懂的语言和通俗易懂的代 ...

  2. 显式Intent与隐式Intent

    1.显式Intent(explicit intent) 显式Intent明确指定了要启动的activity: Intent intent= new Intent(this, Target.class) ...

  3. android intent email,Android Email Intent

    问题 I've set up two buttons. One opens the compose sms intent and the other opens the compose email i ...

  4. Android使用Intent启动Service的Intent必须是显式的

    今天使用Intent来启动Service时,代码如下: //为 Intent设置Action属性 intent.setAction("com.hust.service");star ...

  5. 显式Intent 和隐式 Intent 的区别

    显式 Intent : 在知道目标组件名称的前提下,去调用Intent.setComponent().Intent.setClassName()或Intent.setClass()方法或者在new I ...

  6. Android Intent常用方法详细介绍,显示Intent,隐式Intent,调用浏览器,拨号,发短信,传递数据

    Intent介绍 Intent是Android程序中各个组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据.Intent一般用于启动活动,启动服务以及发 ...

  7. android intent 传递int参数,intent的getIntExtra步骤得不到值

    intent的getIntExtra方法得不到值 最近在学习APP widget,我设置了APP widget中的一个按钮发送一个广播,在广播的intent中putExtra("appWid ...

  8. android parcelable intent,Android:通过Intent传递对象、Parcelable

    1.对要传递的对象类型实现Parcelable:public class User implements Parcelable//对象必须实现Parcelable接口才可以putExtra(或者序列化 ...

  9. Android初学之二:显示Intent和隐示Intent

    一.显式Intent 1.示范如何实现活动跳转 在按钮的点击事件里: a.调用构造函数Intent(Context packageContext,Class<?>cls),第一参数是上下文 ...

最新文章

  1. 迁移到云端的企业数据需注意安全
  2. java xslt 2,使用xsl:for-each-group进行XSLT 2.0分组
  3. Django博客--3.创作后台开启
  4. 单日课程超10万节!VIPKID 如何通过实时计算提升上课体验?
  5. 修改MYSQL数据库表的字符集
  6. Chocolatey 在Window搭建一个开发环境
  7. 四脚贴片晶振的引脚区分
  8. dwg android软件,CAD迷你看图软件手机版
  9. Server JRE 简介
  10. 360度全方位超详尽iPhone5s新手入门宝典(上)
  11. 线性代数 --- 矩阵求逆的4种方法
  12. 结构体定义的三种方法总结
  13. 上云避坑指南100篇|ERP上云一时爽,遇坑泪两行
  14. 菌群多样性是如何形成的,与健康的关系,如何改善?
  15. python发送各类QQ邮件 —— smtplib与email模块
  16. JAVA-操作excel模版进行写入
  17. ubuntu系统(二):ibus拼音将繁体中文改为简体中文
  18. SQL驱动限制,导致插入失败
  19. 基于GIS+BIM技术助力城市地下综合管廊绿色建设发展
  20. 超级科学计算机bug,10%+10%=0.11?一个隐藏的BUG!手机计算器几乎全算错!

热门文章

  1. 戴尔外星人笔记本电脑Alienware m17 R4原装出厂windows10系统恢复原厂OEM系统
  2. DCDC80V降压24V、12V、5V、3.3V/2A电流降压转换器
  3. 【2018百度之星程序设计大赛初赛】rect
  4. 杰理之TWS声道选择【篇】
  5. Ubuntu下CUDA的卸载以及安装(deb方式和run方式)
  6. android窗口小挂件,Android小挂件(APP Widgets)设计指导
  7. 机器学习算法 - 博客收藏
  8. python通过UNO访问LibreOffice/OpenOffice可以使用的命令列表、Filter列表
  9. linux文字界面关机快捷键,LINUX关机快捷键是什么?
  10. Java进阶-案例训练(十六)(商城项目(1))