一个Intent就是一个你能用来向其他任何组件请求行为的消息。尽管Intent以几种方式促进组件间的交流通信,但是有三种是最基本的应用场景:
1、开启一个Activity:在Android APP中一个Activity就是一个用户界面,你能向startActivity方法传递一个Inent来开启一个Activity实例。这个Intent描述了你所要开启的Activity和装在任何需要的数据。
如果你想要在调用结束的时候返回一个结果,你可以调用startActivityForResult方法。你的Activity在这个Activity中的onActivityResult这个回调方法中以Intent对象作为结果返回。
2、开启一个Service:一个Service就是一个没有界面在后台进行某项长时间操作的组件。为了进行一个一次性的操作你能向startService方法传递一个Intent来开启一个Service。这个Intent描述了要开启的服务和装载的数据。
如果这个Service被设计作为客户——服务器接口,你能通过传递一个Intent给bindService方法来和另一个组件的Service绑定。
3、发送一个广播:一个广播就是一个任何应用都能接收到的消息。系统能够为系统事件发送大量不同的广播,例如系统重启或者设备开始充电。你能通过向sendBroadcast、sendOrderedBroadcast、sendStickyBroadcast方法传递一个Intent对象来向其他app发送一个广播。
Intent分为两种类型的Intent:准确的Intent和不准确的Intent
Explicit Intent:准确的Intents指定要开启的组件的类的全名(包括包路径)。你能用EXplicit开启你自己的APP的某个组件,因为你知道要开启的类的名称。
Implicit Intent:不准确的Intents不会设置要启动的组件的类名称,相反他会定义要进行的Action,这个Action允许另一个APP的组件去操作它。例如,如果你想要在一个地图中向用户展示当前位置,你能用不准确的Intent要求另一个APP在地图上展示一个定位。
当你开启一个准确的Intent开启一个组件的时候,系统会立马开启你指定的Intent的组件。
而当你创建一个不准确的Intent时,android系统会把这个Intent中的内容和这个设备上的其他APP定义在Manifest文件中的Intent Filer做对比,然后选择出一个匹配的。如果这个Intent匹配一个Intent Filter,这个设备就会启动这个组件,把这个Intent发送给这个组件。如果多个Intent Filer符合,系统将会展现一个选择框让用户去选择。
注意:为了使得你的APP是安全的,你应该为你的Service组件定义一个精确的Intent,并且不要定义Intent Filer为你的service。因为你不知道哪一个Service发生了相应,用户也不能看到哪一个服务开始了。
构建一个Intent:
一个Intent包含了以下几个部分:
1、组件名称:
这个是可选的,但是他是一个严格的使得这个Intent变得精确的信息,这也意味着这个Intent应该仅仅发送给被这个组件名称定义的APP组件。没有这个组件名称,这个Intent就是不精确的Intent,系统就会依据Intent的其他信息来决定哪一个组件将要接受到这个Intent。因此如果你需要在你的APP中开启一个特定的组件,你应该指定这个组件的名称。
2、Action:
Action是一个用来指定一类动作的字符串。你可以在你的APP之自定义你自己的Intent,也可以使用框架或者Intent类提供的一些公用的Intent(例如ACTION_VIEW和ACTION——SEND)。但是你自定义的ACTION,必须包含你的APP包的前缀。
3、Data:
URI对象映射要表现的数据和或者这个数据的MIME类型。这个Data需要的类型一般由这个Intent的Action所决定。例如一个Action是ACTION_EDIT,这个URI应该包含要编辑文档的URI。
当创造一个Intent时,为URI指定数据类型是非常重要的。例如,一个Activity能够展示图片但是不能够展示一个音频文件,即使这个URI格式是相似的。因此指定这个MIME类型能够使得android系统找到更好的组件接收你的Intent。你可以调用setData仅仅设置数据,setType仅仅设置类型,setDataAndType设置数据和类型。
4、Catagory
一个catagory应该是一个字符串,他包含一些要操作的Intent的组件的一些额外信息。在Intent中可以定义任意多个catagory,但是大都数不需要一个catagroy.
5、Extras
extras是一个额外携带用来完成要求的Action的简直对。就像一些Action用特定类别的数据URI,一些也用指定的extras.
你能用putExtra方法来增加extra 数据,每一个Extra都是一个简直对。你能创造一个Bundle对象来携带所有的extra数据,然后用putExtra方法把这个Bundle对象放入Intent中。
6、Flags
PendingIntent:
一个PendingIntent是一个用来封装Intent的封装器。PendingIntent的一个最基本的目的是为了让外部的应用获取权限去用这个包装起来的Intent就好象是它被执行在你的app自己的进程中。
这个PendingIntent最主要的应用场景是:
1、当用户用Notification来表现一个ACTION的时候定义一个Intent执行。
2、当用户用APPWidget来表现一个Action的时候定义一个Intent执行。
3、当在不久将来的某个特定时间定义一个Intent去执行。
因为每一个Intent对象被用来设计被一个特定的APP组件所调用(一个acitivity或者service或者broadcast receiver),而pendingIntent因为同样的考虑被设计。当用pendingIntent时,你的APP不能用startActivity调用执行。你必须调用一下方法来获取相应类型的PendingIntent:
PendingIntent.getActivity来开启一个Activiy
PendingIntent.getService来开启一个Service
PeidngInent.getBroadcastReceiver来开启一个BroadcastReceiver
除了你的app从其他app接受到的PendingIntent之外,上面创建PendingIntent的方法是仅有的你可能用到的PendingIntent方法。
上面的每一个方法都会传递当前的Context、你要封装的Intent和一个或者更多个指定这个intent应该怎样被用的flag标签。