Android Activity intent-flilter过滤机制

在Android中一个应用(APP1)如果要想调用另一应用的(APP2)的某一个Activity(Activity2),就需要在给Intent设置的参数能够通过Activiy2 在清单文件中声明的<intent-filter>属性验证,才能成功调用到Activity。<intent-filter> 标签中可以使用的验证有:Action验证、Category验证、Data验证,其中Action验证是必须声明的。

  • Action 验证:

一个Activity可以声明多个Action,在验证时只要通过一个即通过验证,如果Activity2声明如下3个Action:

             <intent-filter>
                <action android:name="ACTION1"/>
                <action android:name="ACTION2"/>
                <action android:name="ACTION3"/>
			…………
             </intent-filter>

其他的应用可以通过给Intent设置Action方法调用到Activity2(如果系统中其他应用也有相同的Action,会进行列表供用户选择),如:

<span style="font-size:18px;">Intent intent=new Intent();
intent.setAction("ACTION1");
startActivity(intent);</span>

  • Category验证:

Activity2的<intent-filter>还可以声明多个Category验证,如下(其中DEFAULT那个是系统会自动添加的,及时没声明还是会存在的):

         <intent-filter>
                <action android:name="ACTION1"/>
                <action android:name="ACTION2"/>
                <action android:name="ACTION3"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="CATEGORY1"/>
                <category android:name="CATEGORY2"/>
                <category android:name="CATEGORY3"/>
            </intent-filter>

在其他应用中可以为Intent添加Category,当所添加的Category都在Activity2有声明是就会通过验证,如下Intent就能通过验证:

        Intent intent=new Intent();
        intent.setAction("ACTION1");
        intent.addCategory("CATEGORY1");
        intent.addCategory("CATEGORY3");
        startActivity(intent);

  • Data验证:

Data验证比较复杂点,可以验证Intent中设置的Mime Type和Uri。Mime Type可以指定处理的资源类型,如“audio/*”表示所有音频资源,设置MimeType:

            <intent-filter>
                <action android:name="ACTION1"/>
                <action android:name="ACTION2"/>
                <action android:name="ACTION3"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data
                    android:mimeType="audio/*"
                    />
            </intent-filter>

调用的Intent 可以通过setType()或者setTypeAndNormalize()设置Mime Type,

        Intent intent=new Intent();
        intent.setAction("ACTION1");
        intent.setType("audio/*");
       // intent.setTypeAndNormalize("audio/*");
        startActivity(intent);

Uri比较Url范围广,格式为:scheme://host:port/path,其中scheme为协议标识如:http等,host为IP、域名等,port为端口号,path为路径。在<intent-filter>的<data>中可以对这个几个分别进行设置验证,但是不能跳跃设置,例如设置了scheme,不设置host,直接设置port,这时port的设置将会被忽略,跟没设置port一样。在设置path,可以使用path设置整个路径,也可以使用pathPrefix设置路径以什么开头,还可以使用pathPattern设置带统配符的路径,通配符为“*”和“.*”,其中“*”和正则表达式中的“*”一样,表示前一个字符为0或任意多个,而“.”表示任意字符。如果“abc*d”可以匹配
“abcccd”,“abcd”等,“abc.*d”可以匹配“abced”,“abcfd”等。在<intent-filter>中的<data>设置Uri格式如下:

            <intent-filter>
                <action android:name="ACTION1"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data
                    android:scheme="http"
                    android:path="/abc.jsp"
                    android:host="www.google.com"
                    android:port="8080"
                    android:pathPrefix="/in"
                    android:pathPattern="/i.*n"
                    />
            </intent-filter>

相应的调用Intent可以如下:

        Intent intent=new Intent();
        intent.setAction("ACTION1");
        Uri uri=Uri.parse("http://www.google.com:8080/abc.jsp");//匹配path
       // Uri uri=Uri.parse("http://www.google.com:8080/index.jsp");//匹配pathPrefix
        // Uri uri=Uri.parse("http://www.google.com:8080/idexn");//匹配pathPattern
        intent.setData(uri);
        startActivity(intent);

但是,需要注意的是Intent的setData()方法和setType()会相互覆盖,也就是说,如果先使用setType()设置了Mime Type,之后在使用setData()设置了Uri,那么原先设置的MimeType就会被清空,反之也相同。以下为setData()方法源码,看了就很容易理解了:

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

如果一个Activity的<intent-filter>的<data>中mimeType和Uri都设置了,那就需要使用Intent的setDataAndType(Uridata, String type)进行设置咯。

总结下,如果一个Activity在<intent-filter>中声明了Action验证、Category和Data验证,那么另一个应用要想通过隐式调用这个Activity,就必须在给Intent设置正确的参数,只有全部通过验证才能调用到这个Activity。还有一个需要注意的是,被调用的Activity的exported8属性需要设置为true(默认)才能被其他应用调用。

时间: 2024-08-28 14:35:43

Android Activity intent-flilter过滤机制的相关文章

Android Activity Intent

首先定义一个LifeCycleActivity的类,继承Activity,重写onCreat() onStart()  onResume()  onPause()  onStop()  onDestroy() 1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.util.Log; 4 5 public class LifeCycleActivity extends Activity{ 6 7 @O

Android Activity学习

1.在一个Activity中启动另外一个Activity(显示Intent使用) Button button = (Button) findViewById(R.id.startActivity); button.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View view) {         Intent i = new Intent(MainActivity.t

Android Activity和Intent机制学习笔记

Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态). 对于Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onR

【转】Android Activity和Intent机制学习笔记----不错

原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态

Android中Intent对象与Intent Filter过滤匹配过程详解

如果对Intent不是特别了解,可以参见博文<Android中Intent概述及使用>,该文对本文要使用的action.category以及data都进行了详细介绍. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 概述 我们知道,Intent是分两种的:显式Intent和隐式Intent.如果一个Intent明确指定了要启动的组件的完整类名,那么这个Intent就是显式Intent,否

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了更好地阅读本文,你需要先阅读Android apk动态加载机制的研究这篇文章,在此文中,博主分析了Android中apk的动态加载机制,并在文章的最后指出需要解决的两个复杂问题:资源的访问和activity生命周期的管理,而本文将会分析这两个复杂问题的解决方法.需要说明的一点是,我们不可能调起任何一个未安装的

Android之Intent和Activity

Intent能够说是Android的灵魂,程序跳转和传递数据的时候基本上就是靠Intent了.Intent在Android应用中是相当重要的,理解Intent相应用编程非常有帮助.在Android的官方API文档里边对Intent是这样定义的:An Intent is an abstract description of an operation to be performed.一个Intent就是一次对将要运行的操作的抽象描写叙述(真实够抽象的). 详细有一下3种形式: 1.通过startAc

Android Activity和Intent

Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态). 对于Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onR

【Android的从零单排开发日记】之入门篇(十一)——Android的Intent机制

继续我们的Android之路吧.今天我要介绍的是Android的Intent. 对于基于组件的应用开发而言,不仅需要构造和寻找符合需求的组件,更重要的是要将组件有机的连接起来,互联互通交换信息,才能够最终提供应用所期望的服务.而为了能够更好地实现组件复用,充分地利用每一个组件的能力,就需要这些组件连接的模式足够灵活和统一,并且可以进行动态地扩展.所以Android提供了利用Intent对象建立连接并实现组件通信的模式.Intent对象是Android组件连接的核心,集中体现了整个组件连接模型的设

Android总结篇系列:Activity Intent Flags及Task相关属性

同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 -------------------------------------------------------------------------- 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式的时候,已经了解到一些关于task的技术,今天我再向大