刚看到Intent的时候,我的确有点困惑:从字面上来说,它表示一种意图和目的;从使用上看,它似乎总是用于Activity之间的切换;而从它所在包android.content来看,它似乎与内容有关。所以,我想或许可以这样理解它: Intent类绑定一次操作,它负责携带这次操作所需要的数据以及操作的类型等。
如果是这样的话,是否可以将它与事件处理联想起来?即一个Intent类似于一个Event。从Intent的两个最重要的成员操作类型(Action)和数据(Data)来看,似乎是有道理的。文档中说,Intent的Action的取值主要是一些定义好了的常量,例如PICK_ACTION,VIEW_ACTION,EDIT_ACTION之类的,而Data则是一个ContentURI类型的变量,这一点,我们前面提到过。
而且文档中说Intent分为两大类,显性的(Explicit )和隐性的(Implicit)。在前面的例子中,我们在两个Activity之间跳转时初步使用了Intent类,当时是用setClass来设置 Intent的发起方与接收方,它被称为显性的Intent,而隐性的Intent则不需要用setClass或setComponent来指定事件处理器,利用AndroidMenifest.xml中的配置就可以由平台定位事件的消费者。
一般来说,intent要定位事件的目的地,无外乎需要以下几个信息:
1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。
2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。
3.组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。
4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。
Implicit Intent的使用相对有点麻烦,我们来做一个例子。首先,我们需要增加一个类:HelloThreeProvider,它必须实现于ConentProvider接口,所以代码如下:
public class HelloThreeProvider extends ContentProvider {
<
public boolean onCreate() {
< return true;
< }
<
public int delete(ContentURI url, String where, String[] whereArgs) {
< return 0;
< }
public ContentURI insert(ContentURI url, ContentValues initialValues){
< return url;
< }
< public Cursor query(ContentURI url, String[] projection, String selection,
String[] selectionArgs, String groupBy, String having, String sort) {
< return null;
< }
public int update(ContentURI url, ContentValues values, String where, String[] whereArgs) {
< return 0;
< }
<
public String getType(ContentURI url) {
< return "vnd.sharetop.hello.three/vnd.hello.three";
< }
<}
这里面有一堆方法要实现,因为它们都是ContentProvider中的abstract方法,但是今天的例子中它们多半没有什么用处,只是一个getType方法我们让它不管什么url都返回一个表示Intent所携带的数据类型是我们定义的一个长字串:vnd.sharetop.hello.three/vnd.hello.three。
然后,在AndroidMenifest.xml中我们将上面这个HelloThreeProvider类加入应用程序:
<<application android:icon="@drawable/icon">
< <provider class="HelloThreeProvider" android:authorities="cn.sharetop.android.hello" />
< <activity class="HelloThree" android:label="@string/app_name">
< <intent-filter>
< <action android:value="android.intent.action.MAIN" />
< <category android:value="android.intent.category.LAUNCHER" />
< </intent-filter>
< </activity>
< <activity class="HelloThreeB" android:label="bbb">
< <intent-filter>
< <action android:value="android.intent.action.VIEW" />
< <category android:value="android.intent.category.DEFAULT" />
< <type android:value="vnd.sharetop.hello.three/vnd.hello.three" />
< </intent-filter>
< </activity>
< </application>
相对于前面的例子,主要修改了HelloThreeB的配置,包括增加了一个<category>标签表示这是一个一般性的activity而已。增加了<action>标签,定义它负责处理VIEW_ACTION类型的操作。增加了<type>标签给出一个数据类型的定义串vnd.sharetop.hello.three/vnd.hello.three。最主要的是在<application>下增加的那个<provider>标签,有个authorities属性,我们给的值是cn.sharetop.android.hello,待一会我们再说它的用处。
最后就是修改以前的跳转代码如下:
Intent intent = new Intent();
< intent.setData(new ContentURI("content://cn.sharetop.android.hello/one"));
< intent.setAction(intent.VIEW_ACTION);
< startActivity(intent);
现在我们的setData里的东西可与以前不一样的,是吧?注意到它的格式了吗?content://是个协议头,固定这样写就行了。然后就是那个authorities中定义的串了,再后面就是我们自定义的东西了,我这里很简单的写个one,其它还可以更长一点,如one/101之类的。它负责去关联上那个provider类。另外,增加了setAction的调用设置操作为VIEW_ACTION,与Menifest中的<action>又挂上了。Android平台负责根据Intent的Data信息中的authorities,找到ContentProvider,然后getType,用type和intent中的Action两个信息,再找到可以处理这个intent的消费者。
OK,编译运行。
其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。
关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。
分享到:
相关推荐
本篇“Android学习笔记-- Notifying the User”将深入探讨如何有效地利用通知功能来提升用户体验。 首先,我们要理解Android的通知层次结构。在Android系统中,通知是通过`Notification`类来创建的。这个类包含各种...
Android学习笔记是Android开发者的必读书籍,书中涵盖了Android系统架构、Activity、Intent、资源管理等多方面的知识。本笔记对应的学习资源《第一行代码》是Android开发者的入门必读书籍,书中系统地介绍了Android...
总的来说,理解并熟练掌握Activity和Intent的使用是Android开发的基础。Activity提供了用户交互的窗口,Intent则作为连接各个组件的纽带,共同构建了Android应用的动态流程。开发者需要深入学习这两个概念,以便更好...
BroadcastReceiver是Android四大组件之一,它是应用程序接收系统或其它应用广播事件的重要机制。BroadcastReceiver作为一个全局监听器,即使目标程序没有运行,也能接收到广播并作出响应,这大大增强了应用程序的...
本篇学习笔记将深入讲解如何在Activity中使用Intent进行值传递。 首先,Intent包含两个主要组成部分:action和data。Action定义了Intent的意图类型,例如ACTION_VIEW、ACTION_EDIT等,表示要执行的操作。Data则是...
在Android开发中,电话拨号器是用户与设备进行通话交互的重要组成部分。本篇学习笔记主要探讨了如何自定义电话拨号器的布局以及如何...在黑马的这期学习笔记中,读者可以通过实践这些内容,进一步提升Android开发技能。
Android Intent 学习笔记
Android学习笔记(1)-永远不变的Hello World Android学习笔记(2)-初识Activity Android学习笔记(3)-Activity的生命周期 Android学习笔记(4)-学习Intent的使用,
总之,Android的基础UI编程涵盖了布局管理、控件使用、事件处理、Intent机制、主题样式、资源管理和手势识别等多个方面。通过深入学习和实践,开发者可以创建出功能强大且用户体验优秀的Android应用。
4. **Kotlin语言**:Kotlin是Google推荐的现代Android开发语言,具有简洁的语法、空安全特性和函数式编程特性。学习Kotlin的类、扩展函数、协程等概念,可以提高开发效率和代码质量。 5. **XML布局文件**:Android...
这篇Android学习笔记主要涵盖了从第五章到第十三章的内容,是Android开发者或对Android系统感兴趣的初学者的重要参考资料。笔记详细解读了Android应用开发的核心概念和技术,旨在帮助读者深入理解并掌握Android开发...
4. **数据存储**:在Android开发中,数据存储是一个重要的话题。课程可能会涉及SharedPreferences、SQLite数据库、文件存储以及ContentProvider的使用。 5. **网络编程**:讲解如何在Android应用中实现网络请求,如...
这篇学习笔记将深入探讨Activity的相关知识,包括创建、声明、启动、关闭以及生命周期管理,同时还会涉及Task和Back Stack的管理。 一、Activity创建: 在Android应用中,Activity的创建通常始于一个Java类,这个类...
《Android学习笔记》 在移动应用开发领域,Android操作系统占据着重要的地位,为开发者提供了丰富的API和工具,使得创建各种应用程序变得可能。本压缩包文件包含了一位学习者从第一天到第五天,以及一个特定项目...
android的intent学习笔记.pdf
理解如何使用Intent启动新的Activity并传递数据,是Android应用间通信的关键。 6. **数据持久化**:Android提供了多种存储数据的方式,如SharedPreferences用于轻量级的键值对存储,SQLite数据库用于结构化的数据...
在这个“Android学习笔记–Activity中使用Intent传值示例代码”的主题中,我们将深入理解Intent的工作原理以及如何在不同Activity之间传递数据。 首先,Intent是一个对象,它描述了一次操作的意图,包括操作类型...
同时,理解Android的组件模型,如Activity、Intent、Service、BroadcastReceiver和ContentProvider,也是进一步深入学习Android开发的基础。 总之,"新版Android开发教程&笔记3--环境搭建与解析"将引导你完成...
整个笔记强调了在Android学习过程中,Java编程知识的重要性,并提供了大量代码实例来帮助新手理解Android开发的核心概念和常用组件的使用方法。这份笔记可以作为学习Android开发的入门教材,它覆盖了从基础到实战...