重走Android路-----隐式Intent

[TOC]

在Android开发工作中,Intent是我们经常需要打交道的一个类,我们可以用它来启动Activity、Service和Boardcast,Intent有七大属性:

  • ComponentName
  • Action
  • Category
  • Data
  • Type
  • Extra
  • Flags

根据是否指定componentName,可以将Intent分为显式Intent和隐式Intent,大多数情况下我们使用的都是它的显式用法,在这里对其隐式用法做个整理并记录。
隐式Intent并不会明确指明我们的意图,而是指定了一系列action和category等信息,然后由系统帮我们过滤选出合适的活动去启动,可以用于不同应用程序之间,一般用来启动系统自带的Activity或Service组件。比如调用手机浏览器打开一个网页:

        Intent intent = new Intent();
        //显示Intent
        //intent.setClass(this,SecondActivity.class);
        
        //隐式Intent
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.jianshu.com/"));
        startActivity(intent);
隐式Intent.gif

属性详解

ComponentName

表示要启动的组件的名称。

        Intent intent = new Intent();
        intent.setClass(this,SecondActivity.class);
        //Intent intent = new Intent(this,SecondActivity.class);
        
        startActivity(intent);

这是一段很常见的代码,代表Intent的显式用法,等同于

        ComponentName componentName = new ComponentName(this,SecondActivity.class);
        intent.setComponent(componentName);

其实两种写法是一样的,打开源码一看便知,第一种写法的内部实现就是第二种写法。

Action

action为自定义的一个字符串,用来让系统过滤我们的意图,一般和category、intent-filter搭配使用,category至少有一个,可以多个。

        //AndroidManifest中注册时
        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="action.test"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        //代码中调用,category为 默认的default,故不用指定
        Intent intent = new Intent();
        intent.setAction("action.test");
        startActivity(intent);

系统自带的Action

  • ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。
    每个Android应用至少包含一个此类型的Action声明。如果设置多个,则哪个在前,执行哪个。
  • ACTION_VIEW: (android.intent.action.VIEW)显示指定数据。
    例如上面的调用浏览器打开网页,同理根据数据的不同可以打开地图、发送短信、打开多媒体等等。
  • ACTION_EDIT: (android.intent.action.EDIT)编辑指定数据。
  • ACTION_DIAL: (android.intent.action.DIAL)显示拨号面板。
  • ACTION_CALL: (android.intent.action.CALL)直接呼叫Data中所带的号码。
  • ACTION_ANSWER: (android.intent.action.ANSWER)接听来电。
  • ACTION_SEND: (android.intent.action.SEND)向其他人发送数据(例如:彩信/email)。
  • ACTION_SENDTO: (android.intent.action.SENDTO)向其他人发送短信。
  • ACTION_SEARCH: (android.intent.action.SEARCH)执行搜索。
  • ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT)让用户选择数据,并返回所选数据。

Category

category是action的额外附加的类别信息。

常用Category属性常量

  • CATEGORY_DEFAULT: (android.intent.category.DEFAULT)Android系统中默认的执行方式,按照普通Activity的执行方式执行。
  • CATEGORY_HOME: (android.intent.category.HOME)设置该组件为Home Activity,将是设备启动后第一个显示的界面。
  • CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER)设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN配合使用。
  • CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE)设置该组件可以使用浏览器启动。

Data属性:

Data属性通常用于向Action属性提供操作的数据。Data属性的值是个Uri对象。
Uri的格式如下:scheme:// host:port/path

系统内置的几个Data属性常量:

  • tel://:号码数据格式,后跟电话号码。
  • mailto://:邮件数据格式,后跟邮件收件人地址。
  • smsto://:短息数据格式,后跟短信接收号码。
  • content://:内容数据格式,后跟需要读取的内容。
  • file://:文件数据格式,后跟文件路径。
  • market:// search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
  • geo:// latitude, longitude:经纬数据格式,在地图上显示经纬度所指定的位置。

Type属性

设置MIME data类型(需小写,或者使用setTypeAndNormalize),主要是对data属性的一个说明,但通常情况下data和type有一个便可以了。
MIME type

//Intent源码
public Intent setData(Uri data) {
        mData = data;
        mType = null;
        return this;
    }

public Intent setType(String type) {
        mData = null;
        mType = type;
        return this;
    }

//如果想同时设置data和type,可以调用此方法。
public Intent setDataAndType(Uri data, String type) {
        mData = data;
        mType = type;
        return this;
    }

Extra属性

一般用于数据传递。日常开发中经常使用,不再赘述。值得一提的是系统同样内置了一些key,可以用来携带短信内容等。

Flags属性

可以通过设置flags来控制Intent是怎么被处理的,所有的FLAG_ACTIVITY_* 格式的flag都服务于context.startActivity();所有FLAG_RECEIVER_* 格式的flag都服务于context.sendBroadcast()。
日常开发中通常用来表示Activity的启动模式:

  • Intent.FLAG_ACTIVITY_CLEAR_TASK:在目标Activity启动之前,清除栈内的所有activity,该目标activity成为另一个栈的栈底,只能和FLAG_ACTIVITY_NEW_TASK联合使用。
  • Intent.FLAG_ACTIVITY_CLEAR_TOP:如果栈内存在该activity的实例,则清除该实例上面的所有activity,使该实例位于栈顶。
  • Intent.FLAG_ACTIVITY_NEW_TASK:另起一个activity栈。
  • Intent.FLAG_ACTIVITY_SINGLE_TOP:如果栈内存在该activity的实例,且位于栈顶,则直接使用该实例,不重新创建。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,127评论 25 707
  • Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件...
    牧童遥指2000阅读 5,047评论 0 12
  • Task和BackStack的基本概念 Task的理解 Task是多个Activity的集合,用户进行操作时将与这...
    Reathin阅读 2,040评论 1 4
  • 旅行的意义是什么走走停停四处奔波学习当地的习俗,欣赏当地的美景我想每一个远走他方旅行的人心里都有一段不能触碰的故事...
    稀有时光阅读 219评论 0 5
  • 《绝密543》已经播放二十余集了,我也一集不拉的看了二十余集,电视剧的原型是中国第一代地空导弹部队利用前苏联萨姆2...
    粉色的教室阅读 13,124评论 1 0