原文:

http://bbs.gfan.com/android-93448-1-1.html

今天,我们来研究一下Intent,没错,就是前面说过的比较难理解的那个东西,希望通过这篇文章之后,你发现前面那句话其实是不对的。
前文中说过,Intent就像Activity之间的双面胶,就字面意思而言:“意图, 意向, 目的”, 基本上可以诠释这个对象的作用。它里面包含的就是一些信息,这些信息能够告诉我们当前发生了什么,以及想要干什么。我觉得和前面的事件驱动中的事件非常 像,不同的是,它不仅仅包含事件,还包含一些数据信息。Intent或者也可以说像一个需求说明一样,说明了当前的事件以及一些数据,接下 来,Android会依据这个Intent的说明,为其找到一个Activity,并把这个Intent交给这个Activity。看起来Intent好 像是征婚广告一样哦,Intent提出自己的一些描述(不同的是,他描述的是自己,而不是描述的别人),然后Android根据这些描述找到何时的 Activity。
Intent有两种,一种是显式Intent,另一种是隐式Intent。显式Intent会在自己的说明中直接声明由谁(哪个Activity)来接收 处理这个Intent。显式的Intent是说,我已经有了意中人了,告诉Android不用费劲找了,可以直接定位到意中人,例如前文中的这个例子:

Intent intent = new Intent();
intent.putExtra("name", editText.getText().toString());
intent.setClass(ActivityLifecycle.this, AlertDialog.class);

通过setClass方法,直接告诉Android,此Intent交由AlertDialog处理。也可以通过setComponent()、setClassName()等方法来做同样的事情。
在一般的程序中, 我觉得使用显式Intent已经足够了。这样程序看起来简单易懂,毕竟大多数的Android程序都不会有太复杂的Activity之间的关系。
在前文中的另外一个方法中,使用的就是隐式的Intent。隐式Intent呢,比较含蓄,比较糊涂,比较模糊,还没有明确的目标,并且比较悲观,不会对对方提一些要求,只是描述了一下自己的情况,意思就是说,我就是我所描述的这样的一个人,谁能接受, 谁就可以应征。:)

Intent intent = new Intent();
intent.putExtra("name", editText.getText().toString());
intent.setAction("com.roiding.sample.action.MAIN");

Intent说明自己的方式有:

action 用来指明执行的动作,比如说ACTION_VIEW, ACTION_EDIT, ACTION_MAIN,这都是在Android中定义的标准action,开发者可以自己定义自己需要的action,用字符串来表示。更多标准 action参看这里。
category 描述action的附加信息,这个属性我一直不太明白,它被设计出来的用意到底是为什么,到目前为止,我对他的理解是:它就像一个action类别,例 如:CATEGORY_LAUNCHER、CATEGORY_ALTERNATIVE。属于CATEGORY_LAUNCHER这个类别的,可以被 Android放到顶级列表(类似于九宫格的那个界面)中被执行,属于CATEGORY_DEFAULT这个类别的,可以用 startActivity(intent)来启动Activity,等等。而这些行为都是Android内定的,所以自定义category不知道会有 什么意义,更多标准category参看这里。
data 动作操作的数据,这部分数据会像嫁妆一样,携带给接收它的Activity,Uri格式。Uri的概念和传统的URI的概念是一致的,遵循RFC 2396。 而Uri最终是由ContentProvider提供的,所以会涉及到ContentProvider的概念,这里也暂时不去解释了,只需要知道这个 data所声明的数据,就像一个url一样,通过这个url,可以找到提供这个url的ContentProvider提供的数据,然后就可以操作这些数据了。这里面的data似乎和前面的extras功能有重叠?按照我的理解,data确实可以放到extras中传递,但是单独把它提出来确有它的用意。在后面的IntentFilter中会有交代。

既然已经比喻为征婚广告了,把Intent比喻为征婚的需求,那么由Android系统根据什么挑选的候选人呢?
前面中说过这个文件:AndroidManifest.xml,而且当时将其比喻为户口簿,这下好了,所有的适龄青年(Activity)都在这个大的户口簿上了,按照Intent的需求直接在户口簿中寻找就可以了。那又是如何知道哪个适龄青年是否符合要求呢?
在AndroidManifest文件中,对每个适龄青年(Activity)都做了说明,就是intent-filter,它说明了当前这个适龄青年愿意接收什么样的需求,这样当Intent与这个Intent-filter中的说明一致时,Intent就找到了Activity。
这样,当一个Intent的所有说明,都被Activity的intent-filter接受时,这个Activity就是候选人之一。如果有多个 Activity成为候选人,那么在程序运行的时候Android提示你从多个Activity中手动选择一个来作为最终的intent接收执行者。
对于Activity来说,在它的intent-filter中,可以有多个action,多个category,多个data,这样可以有多个Intent可以与之匹配。
说到这里,前面的那个关于data和extras功能重叠的问题似乎还没有解决,所以这个data的重要的作用就是,它提供了一种反向挑选的机制,使 Activity对Intent也可以提出要求,要求Intent的data必须是intent-filter中声明的data中之一(因为可以有多个 data)。这点是非常重要的,不然又会出现ActivityNotFoundException之类的错误了。
到此篇文章为止,一般的Android界面编程应该已经够用了,而对于ContentProvider、Adapter、Services等,在一般的应用中,可以完全不用考虑。等到必须要使用的时候再说吧。

 
 

Android开发Intent应用概述的更多相关文章

  1. Android开发四大组件概述

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity具体解释 二.Service具体解释 三.Broadcast Receiver具体解释 四.Content Provid ...

  2. Android开发--Intent的使用(1)启动活动

    Android系统是目前世界上市场占有率最高的移动操作系统,近年来,Android开发也越来越炙手可热. 在Android开发中,我们使用Intent进行活动Activity之间穿梭. 当我们点击启动 ...

  3. Android开发--Intent的应用

    1.概述 Intent负责对应用中一次操作的动作,动作涉及的数据,附加的数据进行描述,起到媒介的作用.通过Intent对象指定一个activity,利用startActivity或 startActi ...

  4. android 开发 Intent使用技巧点

    判断Intent是否为null: if (intent.resolveActivity(getPackageManager())!=null) { //判断Intent是否为null // Inten ...

  5. Android 开发-Intent传递普通字符串

    假设A传递id到B中 ActivityA: Intent intent=new Intent();    intent.setClass(ActivityA.this,ActivityB.class) ...

  6. Android开发--Intent

    一:Intent基础知识 Intent:信使,实现四大组件间的通信. 1:实现页面间的跳转,有两种方式: (1):startActivity()方式: (2) 2:使用Intent传递数据的四种方式: ...

  7. Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解

    前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...

  8. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

  9. Android开发中使用Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...

随机推荐

  1. codeforces 1204C Anna, Svyatoslav and Maps(floyd+dp)

    题目链接:http://codeforces.com/problemset/problem/1204/C 给定一组序列,P1,P2,P3...Pm,这是一组合法路径的序列,即任意的Pi和Pi+1之间有 ...

  2. django入门与实践(开)

    1.什么是Django? 基于python的高级web开发框架 高效 快速 免费 开源 正常上网流程 浏览器浏览网页的基本原理 请求响应过程 开发环境搭建 Python Django pip inst ...

  3. Gym-TORCS安装

    系统为Ubuntu16.04来安装Gym-TORCS 安装pip: sudo apt-get install python-pip sudo pip install --upgrade pip 安装p ...

  4. Eugeny and Array(思维)

    Eugeny has array a = a1, a2, ..., an, consisting of n integers. Each integer ai equals to -1, or to ...

  5. 排查 k8s 集群 master 节点无法正常工作的问题

    搭建的是 k8s 高可用集群,用了 3 台 master 节点,2 台 master 节点宕机后,仅剩的 1 台无法正常工作. 运行 kubectl get nodes 命令出现下面的错误 The c ...

  6. Panda的学习之路(2)——pandas选择数据

    首先定义panda dates=pd.date_range(',periods=6) # print(dates) df=pd.DataFrame(np.arange(24).reshape(6,4) ...

  7. 并发编程之CyclicBarrier

    栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier可以使 ...

  8. springboot笔记-2-.核心的上下文以及配置扫描解析(上)

    前言 上一节中说明了springboot是如何做到自动发现配置的,那么本节看下spring如何创建上下文并解析这些配置,加载我们注册到容器管理中的类.上节已经成功的创建了SpringApplicati ...

  9. URLEncode和URLDecode

    URLEncode.encode(String s,String utf-8) 编码 URLDEcode.decode(String %2b%,String utf-8) 解码 用法: String ...

  10. STA之AOCV

    为什么要引入AOCV 为了精确性,为了剔除悲观度.用set_timing_derate来设置OCV,对于一个固定的corner,只能对data/clock, cell/net, late/early分 ...