`
pxq19890719
  • 浏览: 51772 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于Android intent的知识

阅读更多
意图在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");这样就正确了。

    {故,自己暂时认为,当意图中匹配意图过滤器中有数据的类型是必须要匹配数据的Uri(数据包含Uri和数据类型)。(没做实验)}

    到此,Intent的知识算是结束了。
分享到:
评论

相关推荐

    Android Intent切换.zip

    通过研究源码,开发者可以学习到如何正确构建和使用Intent,以及如何在不同组件间传递数据,这对于构建功能丰富的Android应用来说是必不可少的知识。同时,访问提供的链接可以获取更多学习资源,持续提升Android开发...

    Android Intent多种传值方式

    在Android应用开发中,Intent是一种非常关键的组件,它用于在不同的组件之间传递消息和数据。Intent不仅可以启动或启动服务,还可以实现Activity之间的数据传递。本文将深入探讨Android Intent的多种传值方式。 1. ...

    android Intent实例

    #### 二、Intent 基础知识 `Intent`是Android中的一个类,用于封装一个操作请求。它可以被用来启动一个新的Activity(活动)、启动服务、广播事件等。`Intent`主要有两种形式:显式Intent和隐式Intent。 - **显式...

    Android使用Intent实现Video功能

    在Android开发中,Intent是一种非常重要的组件,它用于在应用程序之间传递消息,也可以用来启动其他应用程序的组件,如Activity、Service等。...通过熟练掌握这些知识点,你可以轻松地在Android应用中集成视频功能。

    Android中Intent的Uri使用

    ### Android中Intent的Uri使用详解 #### 概述 在Android开发中,`Intent`是进行组件间通信的重要工具之一,它可以启动一个Activity、BroadcastReceiver或Service,也可以用来向服务发送数据请求。其中,`Intent`的...

    Android程序间Intent跳转分析

    本文将深入探讨Android程序间Intent跳转分析的相关知识点。 首先,Intent是Android系统中的一种消息对象,用于封装一个动作(Action)以及动作涉及的数据(Data)。在描述中提到的"跳转分析器"是一个开发者工具,它...

    android intent跳转

    ### Android Intent跳转详解 在Android开发中,`Intent`是一种非常重要的...综上所述,Intent在Android开发中扮演着极其重要的角色,熟练掌握Intent的相关知识对于提高应用程序的功能性和用户体验有着至关重要的作用。

    Android整数乘法计算器(帮助理解Intent)

    在Android开发中,Intent是一种非常重要的组件,它用于在应用程序的不同组件之间传递消息,比如启动一个...通过实际操作,你可以更深入地学习到Android应用开发的基础知识,为进一步学习更复杂的概念打下坚实的基础。

    Android 广播大全 Intent Action 事件.

    以下是 Android 广播大全 Intent Action 事件的详细知识点: 1. Intent.ACTION_AIRPLANE_MODE_CHANGED:当飞行模式被打开或关闭时,系统会发出此广播,通知相关应用程序进行相应的处理。 知识点:飞行模式是 ...

    Android应用源码之Intent.zip

    本资料"Android应用源码之Intent.zip"包含了一份关于Intent使用的源码示例,下面将详细解释Intent的相关知识点。 1. **Intent的类型**: - 显式Intent:明确指定要启动的目标组件,通过组件的类名(ComponentName...

    Android Intent切换.rar

    在Android应用开发中,Intent是一种强大的机制,用于在应用程序组件之间进行通信,它承载着启动一个新活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver)的信息。本资源"Android Intent切换....

    Android Intent带返回值跳转Demo

    在Android应用开发中,Intent是连接各个组件(如Activity、Service等)的桥梁,它用于启动其他组件并...在Intent中处理返回值是Android开发中不可或缺的一部分,理解并运用好这部分知识,将使你的应用更加健壮和灵活。

    Android Intent传递数据大小限制详解

    这篇文章将详细介绍Android Intent传递数据大小限制的相关知识点。 一、Intent传递数据的限制 Intent可以携带一些数据,比如基本类型数据(int、Boolean、String)或序列化对象(Parcelable、Serializable)。但是...

    05_第5章_Intent与BroadcastReceiver_AndroidIntent_android_

    在"05_第5章_Intent与BroadcastReceiver.pdf"文件中,你将深入学习到这些知识点的详细内容,包括实例演示和最佳实践,帮助你更好地理解和掌握Intent与BroadcastReceiver在Android开发中的应用。通过阅读这份文档,...

    Android开发教程之Intent详细讲解--千锋培训

    【Android开发教程之Intent详细讲解】 Intent在Android开发中...理解Intent的工作原理和使用方法对于任何Android开发者来说都是必不可少的知识。通过熟练掌握Intent,开发者可以构建出功能丰富、交互流畅的应用程序。

    Android Intent 学习

    在Android开发中,Intent是一个非常核心且重要的组件,它起到了应用程序之间通信的桥梁作用。Intent不仅可以启动活动(Activity)、服务(Service),...通过实践“Android Intent学习实例”,能够巩固和提升这些知识。

    Android Intent

    以上就是关于Android Intent的基本知识点。通过实践项目"demo_intent",你可以更直观地体验Intent的使用,从而加深理解。学习Intent对于任何Android开发者来说都是至关重要的,因为它贯穿于应用程序的各个部分,是...

    android Action call 拨打电话 Intent.ACTION.CALL

    当我们想要从应用中拨打电话时,就需要用到Intent ACTION_CALL这个知识点。接下来,我们将深入探讨如何在Android中使用Intent ACTION_CALL来实现拨打电话的功能。 首先,理解Intent ACTION_CALL的含义是关键。...

    Android Intent切换

    本文将深入探讨“Android Intent切换”的相关知识点,帮助初学者更好地理解和掌握这一关键技术。 首先,Intent可以分为显式Intent和隐式Intent。显式Intent明确了要启动的目标组件,通过指定组件的类名(包名+类名...

    Android_intent_大全

    本篇文章将全面解析Android Intent的使用及相关知识点。 首先,Intent主要有两种类型:显式Intent和隐式Intent。显式Intent通过指定组件的完整类名来直接调用目标组件,而隐式Intent则不指定具体组件,而是通过...

Global site tag (gtag.js) - Google Analytics