Intent详解之路02_隐式指定Intent

来源:互联网 发布:linux 设置代理上网 编辑:程序博客网 时间:2024/05/29 08:34
1.上次说到了显式声明,这次来说下Intent的隐式使用方法。相对于Intent显式声明时直接指定
要启动的Activity类,隐式使用的时候只需要设置它的部分属性,让它自动去筛选适合的Activity
来启动,这样子便于高层次的解耦...把Action和Activity分离开来
2.截个图,了解一下Intent究竟有哪几个常用的属性?
上面是在官方API上的截图
3.隐式的使用大体上分为两种方法吧.
(1)只通过指定action和category属性来达到筛选Activity的目的.
                /*                 * Intent的隐式声明主要通过设置它的action,category,type,data的属性                 * 来达到筛选适合的Activity                 */                String action = "activity3_action";                String category = "activity3_category";                //1.下面是设置它的action属性的方法,action名字可以随便起                //  不过在AnroidMainfest.xml中Activity中的Action名字要和它一样哦                Intent intent = new Intent();                intent.setAction(action);                //也可以直接初始化时候直接指定                Intent intent2 = new Intent(action);                //当没有指定Intent的category的属性的时候,系统默认是android.intent.category.DEFAULT                //所以我们必须要在AndroidManifest.xml中把Activity的category属性给加上去                //我们可以通过addCategory的方法来指定category的属性,category的内容自定义                //intent2.addCategory(category);                startActivity(intent2);

在AndroidManifest.xml中,TestActivity3是这样子定义的.
        <activity             android:name="com.galis.android_intent.Test3_Activity"            android:label="Test3Activity"            >            <intent-filter>                <action android:name="activity3_action"></action>                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>

注意的是:action和category都是必须的,如果是隐式Intent的话,而且必须有一个category名字
是android.intent.category.DEFAULT,系统在调用intent跳转的时候会默认加上这个category。
如果你再增加一个category,如下图,该Intent就相当于有两个category,一个是默认的,
一个是新加的,这两个都要在AndroidManifest.xml中配置出来
     Intent intent2 = new Intent();                intent2.setAction(action);                intent2.addCategory(category);                startActivity(intent2);

在配置文件中是这样的:
        <activity             android:name="com.galis.android_intent.Test3_Activity"            android:label="Test3Activity"            >            <intent-filter>                <action android:name="activity3_action"></action>                <category android:name="android.intent.category.DEFAULT" />                <category android:name="activity3_category"/>            </intent-filter>        </activity>


在配置文件中,当intent的所有属性在某一个Activity中的intent-filter中匹配到,那么这个Activity就
符合启动的要求..
(2)通过Data,Type属性筛选Activity
首先看下Data和Type属性在哪里设定?

当只设置了Data或Type属性的时候,action的属性变得无关重要,不过它也是必须的,虽然你可以随意起名字
就是说,假如你新建一个Intent:Intent myIntent = new Intent();myIntent.setData(Uri.parse("galis://xxx:xx/xx"));
虽然你没有设置它的action是什么,不过在配置文件中你也必须要给它一个声明,即使它是没有意义的
如上图,<action android:name="xx">
那么Type和Data分别是什么?有什么用呢?
*Type指的是Data所指定的URI对应的MIME类型,它是可以自定义的,不过要符合abc/xyz格式
*Data就是一个Uri对象,它用于向Action属性提供操作的数据,通常有scheme,host,port,path组成
如:galis://android_intent:8888/ga
Intent对于Data的匹配方法是怎么样的呢?
简单来说,Intent所携带的信息必须满足Intent-Filter中的Data属性的所有内容,下面的XX部分可以不写
eg1.
            <intent-filter >                <action android:name="xx"/>                <category android:name="android.intent.category.DEFAULT"/>                <data                     android:scheme="galis"                    />            </intent-filter>
java1.那么只要你新建的Intent携带的Data属性中的scheme部分等于galis就行
Intent intent = new Intent();
intent.setData(Uri.parse("galis://XXX:XX/XX"));
eg2.
            <intent-filter >                <action android:name="xx"/>                <category android:name="android.intent.category.DEFAULT"/>                <data                     android:scheme="galis"                    android:host="android_intent"                    />            </intent-filter>


java2.那么只要uri中的scheme部分和host部分与filter中的内容相等就行
Intent intent = new Intent();
intent.setData(Uri.parse("galis://android_intent:XX/XX"));
startActivity(intent);
eg3.
            <intent-filter >                <action android:name="xx"/>                <category android:name="android.intent.category.DEFAULT"/>                <data                     android:mimeType="galis/gaga"                    android:scheme="galis"                    android:host="android_intent"                    android:port="8888"                    android:path="/ga"                    />            </intent-filter>

java3.当有mimeType和Data部分同时存在的时候,必须要用到setDataAndType的方法
Intent intent  = new Intent();
intent.setDataAndType(Uri.parse("galis://android_intent:8888/ga"),"galis/gaga");
startActivity(intent);
*为什么要这样子呢?看下面
*Intent要是先设置Data属性,后设置Type属性的话,那么它的Type属性就会覆盖Data属性
如果你这样子写:
Intent intent = new Intent();
intent.setData(Uri.parse("galis://android_intent:8888/ga"));
intent.setType("galis/gaga");
startActivity(intent);
那么该intent就只有Type属性了...
*同理先设置Type,后设置Data的话,后者会覆盖前者
*所以同时设置要用到setDataAndType方法。。
写了两个小时,把Intent的用法大概总结了一篇...继续努力吧...
原创粉丝点击