Intent以及IntentFileter大全

等待填充android系统常用的各种intent-filter 

1显式 Intent 以及隐式 Intent

注意:为了接收隐式的Intent对象,在Intent过滤器中必须包含CATEGORY_DEFAULT分类。如果包含了CATEGORY_DEFAULT分类,startActivity()startActivityForResult()方法启动的所有的Intent对象就会被处理,否则,隐式的Intent对象就不会被你的Activity所接收

Android中鼓励在程序的设计中尽量减少组件的耦合,因此Android中提供了一系列减少耦合的做法,表层我们熟悉的比如xml的布局文件和Activity分离,除此之外,还有一个重要的内容就是intent。它就好比是各个组件中互相通讯的纽带,在四大组件中除了内容提供之外,其他的三大组件都可以通过intent来通讯。除此之外,intent还有启动其他组件的作用。比如启动Activity,服务,绑定服务,通过intent还可以在广播之间传递数据。

对于intent主要的分类主要包括隐式意图和显式意图。显式意图通常主要是启动本应用中的Activity之间的数据,而隐式意图则常见于启动系统中的某些特定的动作,比如打电话,或者是跨应用的Activity启动。

一般:

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

  动作测试(Action test)

  一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:

  • 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。

  • 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

  类别测试(Category test)

  对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。

  原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。但有一个例外,Android把所有传给 startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN" 和"android.intent.category.LAUNCHER"设置的过滤器是例外)

  数据测试(Data test)

  当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的 URIs都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的 URIs才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

 

  数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:

  a. 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。

  b. 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。

  c. 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。

  d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。

    public class MainActivity extends Activity   
    {  
        /** Called when the activity is first created. */  
        @Override       
        public void onCreate(Bundle savedInstanceState)   
        {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
              
            Button button = (Button) this.findViewById(R.id.button);  
            button.setOnClickListener(new View.OnClickListener()   
            {  
                @Override  
                public void onClick(View v)   
                {  
                    Intent intent = new Intent();  
                    intent.setAction("com.hoo.kay");  
                    //设置数据URI与数据类型匹配  
                    //intent.setData(data);  
                    //intent.setType(type);注意这个方法会清除setData的内容,所以如果既要设置类型与数据,那么使用setDataAndType  
                    intent.setDataAndType(Uri.parse("hoo://www.hoo.com/person"), "image/gif");  
                    startActivity(intent);  
                }  
            });  
        }  
    }  


<application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
                <activity android:name=".OtherActivity"  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.hoo.kay" />
                <action android:name="com.hoo.kesen" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.hoo.category.li" />
                <data android:scheme="hoo" android:host="www.hoo.com" android:path="/person"/>
                <data android:mimeType="image/gif"/>
            </intent-filter>
        </activity>
    </application>


参考文档 http://blog.csdn.net/think_soft/article/details/8749502

http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html

http://www.cnblogs.com/yaozhongxiao/archive/2013/10/12/3365345.html

http://blog.csdn.net/new_abc/article/details/13627853

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值