android学习笔记1——Intent

android学习笔记1——Intent

(注:内容主要来源于developer.android.com,以及任玉刚大神的《android开发艺术探索》)

Intent的定义:Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。
Intent 分为两种类型:

  1. 显式 Intent:按名称(完全限定类名)指定要启动的组件。 通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,启动新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
  2. 隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。 例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。

Intent的作用:主要三个

  1. 启动activity
  2. 启动服务:从android5.0开始如果采用隐式启动方式启动服务,那么会报异常,官方不推荐使用隐式启动服务,不安全,不知道启动是哪个服务,且用户看不到启动的服务。
  3. 传递广播:通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。

Intent构成:
1. 组件名称:有就是显式,没有就是隐式
2. action:操作
3. category:类别
4. data:URI(://host:port/[||])和MIMEtype(”image/jpeg”,”video/*”等) (注:intent的setData和setType方法是相互冲突的,如果要同时设置要调用setDateAndType
5. extra:传递键值对
6. 标志:在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的 Activity 列表)。

Intent的匹配:(敲黑板,重点)
1. Action匹配:intent中定义的action必须与过滤器中的定义的action(可以是多个)中的一个action完全匹配。如果intent中没有定义action,那么匹配总是失败。
2. Category匹配:如果intent中存在category,那么每个category必须在过滤器中存在。如果没有category字段,匹配依然可以成功(只要过滤器中有Defaut)。但是如果过滤器中没有定义“android.intent.category.Default”那么,如果intent没有定义category,那么匹配总是失败
3. data的匹配:
仅当过滤器未指定任何 URI 或 MIME 类型时,不含 URI 和 MIME 类型的 Intent 才会通过测试。
对于包含 URI 但不含 MIME 类型(既未显式声明,也无法通过 URI 推断得出)的 Intent,仅当其 URI 与过滤器的 URI 格式匹配、且过滤器同样未指定 MIME 类型时,才会通过测试。
仅当过滤器列出相同的 MIME 类型且未指定 URI 格式时,包含 MIME 类型、但不含 URI 的 Intent 才会通过测试。
仅当 MIME 类型与过滤器中列出的类型匹配时,同时包含 URI 类型和 MIME 类型(通过显式声明,或可以通过 URI 推断得出)的 Intent 才会通过测试的 MIME 类型部分。 如果 Intent 的 URI 与过滤器中的 URI 匹配,或者如果 Intent 具有 content: 或 file: URI 且过滤器未指定 URI,则 Intent 会通过测试的 URI 部分。 换言之,如果过滤器只是列出 MIME 类型,则假定组件支持 content: 和 file: 数据。

强制使用应用选择器:

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

如果不确定intent是否会匹配成功,用以下代码:

if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }

你可能感兴趣的:(android开发)