意图在android的应用开发中是很重要的,明白了意图的作用和使用后,对开发会有很大帮助。如果没有把意图搞懂,以后开发应用会感觉缺些什么。   

    意图的作用:   

    1、激活组件  

 

    2、携带数据   

    3、意图的匹配(运用到隐式意图)  

 

    android基本的设计理念是鼓励减少组件间的耦合,因此android提供了Intent(意图),用意图激活其他组件。Intent提供了一种通用的消息系统,它允许在你的应用程序与其他应用程序间传递Intent来执行和产生事件。使用Intent可以激活android应用的三个核心组件:活动、服务和广播接收器。Intent代表了要执行的某一种想法,要干的某一件事情。   

    意图可划分为显式意图和隐式意图。  

 

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

    如:Intent intent = new Intent();  

 

        intent.setAction(Activity1.this,Activity2.class);   

        startActivity(intent);   

        显式意图很简单,此处就不再赘述。  

 

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

 

  如调用电话拨号:Intent intent = new Intent();  

 

                  intent.setAction("android.intent.action.CALL");  

 

                  intent.setData("Uri.parse("tel:") + mobile");//mobile为电话号码(是数字)   

                  startActivity(intent);  

 

    如果采用隐式意图来激活组件,是怎么样找到组件的?  

 

    解释:如,电话拨号器在定义的时候,意图过滤器(Intent-filter)是这样定义的  









   产品经理必学的五个锦囊妙计  产品方法  产品思维  产品设计  交互体验    

  









 

    <Intent-filter>   

        <action android:name="android.intent.action.CALL"/>   

        <category android:name"android.intent.category.DEFAULT"/>   

        <data android:scheme="tel"/>   

    </Intent-filter>  

 

       1、先是有一个动作名称,<action android:name="android.intent.action.CALL"/>是由拨号器内部定义的,自己开发的应用也可以自己定义。   

       2、类别,在代码中并没有设类别,原因:当我们调用startActivity方法将intent意图传给操作系统时,startActivity方法的内部会为intent这个意图添加进一个类别,这个类别就是android.intent.category.DEFAULT。  

 

      3、数据,数据包含两个方面,数据所代表的Uri和数据的类型,此例中没有数据的类型,只有Uri,Uri又由scheme、主机名、路径三部分组成,对于Uri的匹配,只要跟给定的某一部分匹配就行了,此例中只要和scheme匹配就行。  

 

      此时,代码就可以和意图过滤器匹配了,因此,它就会调用这个过滤器所在的Activity,由此实现电话拨号功能。  

 

  那么,显式意图和隐式意图分别在什么场合使用呢?  

 

      显式意图一般在应用的内部使用,因为,在应用内部已经知道了组件的名称,直接激活就行了。  

 

      当一个应用要激活另一个应用中的Activity时(看不到源代码),只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。所以,隐式意图是在应用与应用之间使用的。(如果自己开发的应用,希望其中的某个Activity能让其他应用访问到,就为这个Activity定义一个意图过滤器,则,其他应用就可以根据意图过滤器中的参数设置意图对象,然后传给操作系统,操作系统就可以找到和这个意图匹配的过滤器,找到过滤器后就可以激活意图所在的Activity)
  

下面举一个例子:  

 

在FirstActivity中点击按钮跳到SecondActivity中(用隐式意图):   

在AndroidManifest中   













  









<activity android:name=".SecondActivity"  android:label="@string/app_name">   

            <intent-filter>   

                <action android:name="cn.itcast.xiao.li" />   

                <action android:name="cn.itcast.xiao.zhang" />  

 

                <category android:name="android.intent.category.DEFAULT" />   

                <category android:name="cn.itcast.category.li" />   

                <data android:scheme="itcast" 

android:host="www.itcast.cn" 

android:path="/person"/>  

 

                <data android:mimeType="image/gif"/>   

            </intent-filter>    

 

代码:onCreate部分  

 

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("cn.itcast.xiao.li");   

                intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), 













  









"image/gif");  

 

                startActivity(intent);   

            }   

        });   

    }   

  

其中,action的name随便设,category的name也可以随便设,不过android.intent.category.DEFAULT是调用startActivity时内部自动生成的。  

 

    在意图过滤器中可以有多个动作和类别,但意图只能定义一个动作,所以只要定义的这个动作(action)和意图过滤器中的任意一个匹配就可以成功。类别(category)也是,只要匹配其中一个就行,不必匹配所有。但是,如果定义的类别在意图过滤器中找不到,就会报错,也就是说意图中定义的动作和意图在过滤器中必须有。  

 

    注意:若intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");分开写,即:intent.setData(),intent.setType()(括号中的东西略)时,就算是都匹配也会报错。原因:在setType()文档中有一句话,This method automatically clears any data that was previously set by setData(Uri).也就是说,当设置了setType时会自动清除setData中的内容。所以,解决方法:写成intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"),
"image/gif");这样就正确了。 

Android 显示意图和隐式意图的区别的更多相关文章

  1. Android学习记录(7)—Intent中显示意图和隐式意图的用法

    Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的 ...

  2. 基础学习总结(八)--Intent中显示意图和隐式意图的用法

    Intent(意图)主要是解决Android应用的各项组件之间的通讯.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组 ...

  3. Android的显示意图和隐式意图总结

    显示意图 简而言之: 通过指定特定Activity的包名和类名开启Activity 应用场景: 一般应用于本App内的activity间的跳转. XML配置信息: AndroidManifest.xm ...

  4. Android中显式意图和隐式意图的区别

    1.显式意图 可以直接通过名称开启指定的目标组件: 通过构造方法Intent(Context packageContext,class<?>cls)来实现. button_1 = (But ...

  5. Activity组件:(一)通过显式意图和隐式意图来实现Activity间的跳转

    一.通过显式意图来实现Activity间的跳转 显式意图是指在创建Intent对象时就指定接受者组件 /** * 下面是通过显式意图进行跳转,即明确写出要跳转到SecondActivity.class ...

  6. Activity组件(二):通过显式意图和隐式意图来跳转至第三方应用

    一.显式意图来跳转到第三方应用 /** * 这个方法会在点击按钮的时候执行 * @param view */ public void skip2Browser(View view){ Log.d(TA ...

  7. selenium的显示等待和隐式等待的区别

    什么是显示等待和隐式等待?显示等待就是有条件的等待隐式等待就是无条件的等待 隐式等待 当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出 ...

  8. android intent 隐式意图和显示意图(activity跳转)

    android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity  B ...

  9. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

随机推荐

  1. (六)python3 字符串常用方法

    字符串截取  >>>s = 'hello' >>>s[0:3] 'he' >>>s[:] #截取全部字符 'hello' 消除空格及特殊符号   ...

  2. journals in Fluid Dynamics

    annual review of fluid mechanicsjournal of fluid mechanicsphysics of fluidjournal of flow and struct ...

  3. Bazinga HDU 5510 Bazinga(双指针)

    Bazinga HDU 5510 Bazinga(双指针) 题链 解法:对于串i来说,如果串i是不符合的,那么代表串i之前的字符串都是i的子串,那么我们求一个新的i(定义为ti),如果i是ti 的子串 ...

  4. spring cloud feign 坑

    feign是啥? 很多人可能对于feign 不是很熟悉,可以看一下其他网友的实例分享:spring cloud feign简介 如果觉得上面这个比较难的话,还有一个简单入门的:spring cplou ...

  5. hadoop 3.0.0新特性

    1.Minimum required Java version increased from Java 7 to Java 8 java最低支持版本变成java8 2.Support for eras ...

  6. Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

  7. 转载 - C++ - 关于ifstream/fstream流 判断文件是否结束eof()的问题

    出处:http://blog.csdn.net/shuilan0066/article/details/4669451 在做实验的时候遇到这个问题,找原因的时候发现出处除了讲明原因,还举了例子,所以记 ...

  8. IBOutlet loadView UIButton的subview数量 UIWebView

    IBOutlet声明的插座变量和属性一起使用的时候,在.m文件调用的是属性. 在loadView方法中获取view属性会产生循环引用问题并导致内存溢出. Control+E到行尾,Control+A到 ...

  9. com.101tec.ZKClient实现中的subscribeDataChanges设置的监听器事件不回调的问题研究

    1.如果在Web项目,本身在后台运行,所以注册的事件应该是正常回调的. 2.如果是Application项目,如果是简单的测试,那么运行完之后,整个程序就结束了,程序很快,所以没等到事件回调就关了,解 ...

  10. 28、Java并发性和多线程-剖析同步器

    以下内容转自http://ifeve.com/anatomy-of-a-synchronizer/: 虽然许多同步器(如锁,信号量,阻塞队列等)功能上各不相同,但它们的内部设计上却差别不大.换句话说, ...