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

作者: 风少侠 | 来源:发表于2017-12-06 15:49 被阅读184次

    [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的实例,且位于栈顶,则直接使用该实例,不重新创建。

    相关文章

      网友评论

        本文标题:重走Android路-----隐式Intent

        本文链接:https://www.haomeiwen.com/subject/gvvcpxtx.html