第一章(显式Intent和隐式Intent)

显式Intent和隐式Intent

显式Intent

  1. 在第一个Activity中设置一个Button
    

在第一个Activity中设置这个button3的监听

    public void button3(View view){
        Intent intent=new Intent(this,SecondActivity.class);
        startActivity(intent);
    }

Intent构造里面第一个参数传入上下文,第二个参数作为跳转目标

隐式Intent

隐式Intent相对而言比较复杂,原则上一个Intent不应该既是显示调用又是隐式调用,如果二者存在的情况下,以显示为主。隐式调用需要Intent能够匹配目标组件IntentFilter里面设置的过滤信息,如果不匹配将无法启动目标Activity。IntentFi中的过滤信息有action、category、data。下面举个例子:

  
            
                
                
                
            
        

从Activity跳转到SecondActivity:

 public void button4(View view){
        Intent intent=new Intent();
        intent.setAction("com.example.menuinactivity.WHATEVER");
        intent.addCategory("MYCATEGORY");
        startActivity(intent);
    }

这里需要注意的是每个Intent只能指定一个action,但能指定多个category,其中"android.intent.category.DEFAULT"是默认添加的,所以在Activity中不需再次添加

下面详细介绍action、category和data的匹配规则:

  1. action的匹配规则:
    action是一个字符串,系统预定义了一些action,同时我们也可以在应用中定义自己的action,action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配(字符串值完全一样),一个过滤规则可以有多个action,只要Intent中的action能够和过滤规则中的任意一个action相同即可匹配成功,它和category的匹配规则不一样。需要注意的是,Intent中如果没有指定action那么匹配失败,另外,action是区分大小写的。
  2. category的匹配规则:
    category是一个字符串,系统预定义了一些,自己也可以定义自己的category,它和action的匹配规则不同,Intent里面可以没有category,一旦有category,不管有几个,每个都要和过滤规则中的任何一个category相同。
  3. data的匹配规则
    先看个例子:
 
            
                
                
                
            
        

activity中:

    public void button6(View view){
        Intent intent =new Intent();
        intent.setAction("THIRDACTIVITY");
        intent.setData(Uri.parse("http:\\www.baidu.com"));
        startActivity(intent);
    }

我们在IntentFilter中自定义了一个action,另外在data中通过android:sheme指定了数据的协议必须是http协议,这样ThirdActivity就能响应一个打开网页的Intent了。
data的语法如下:


data由两部分组成,mineType和URI,前者指媒体类型,比如image/jpeg、video/*等可以表示图片、文本、视频等不同媒体格式,而URI包含的数据就比较多,下面是URI的结构:
: //:/[||]
如:http://www.baidu.com:80/serach/info
content://com.example.project:203/folder/subfolder/etc

解释:
Scheme:URI的模式,比如http、file、content等,如果URI中没有指定scheme,那么整个URI其他参数无效,即这个URI是无效的
Host:URI的主机名,比如“www.baidu.com”,如果host未指定,那么整个URI的其他参数无效,即这个URI无效
Port:URI的端口号,仅当URI中制定了scheme和host参数时port才有意义
Path、pathPattern、pathPrefix这三个参数表示路径信息,path和pathPattern都表示完整的路径信息;但pathPattern里面可以包含通配符“”,“”表示0个或多个任意字符,注意“*”要写成“\\*”,“\”要写成“\\\\”;pathPrefix表示路径的前缀信息
(1)如下过滤规则:



...

这里指定了媒体类型为所有类型的图片,那么Intent中的mimeType属性必须为“image/*”才能匹配,这种情况下虽然过滤规则中没有指定URI,但是却有默认值,URI的默认值为content和file,即Intent的中的URI部分的scheme必须为content和file才能匹配

intent.setDataAndType(Uri.parse("file://abc"),"image/png")

如果要为Intent指定完整的data,必须要调用setDataAndType方法,不能先调用setData再调用setType,因为这两个方法会彼此清除对方的值,看setData源码:

    public @NonNull Intent setData(@Nullable Uri data) {
        mData = data;
        mType = null;
        return this;
    }

(2)如下过滤规则:


intent.setDataAndType(Uri.parse("http:/abc"),"video/mpeg")

data还可任意这样写也是与action不同的地方

  


关于显示Intent和隐式Intent也就讲完了
声明:参考《Android开发艺术与探索》

你可能感兴趣的:(第一章(显式Intent和隐式Intent))