和四大组件关系最紧密的Intent-----意图(一)

来源:互联网 发布:朋友印象是什么软件 编辑:程序博客网 时间:2024/05/17 02:36

一、Intent的简介

Intent:意图,向Android系统表达下一步操作。
一个Intent对象就是对一次将要执行操作的抽象描述。Intent代表了Android应用的启动意图,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各属性。意图中包含的属性主要有:
Component(目标组件),Action(动作),Category(附加信息), Data(数据),Type(数据类型),Extra,Flag这7个属性。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。

二、显式意图和隐式意图

1、显式意图:明确指定Intent的目标组件。一般用于同一应用程序之间的跳转。

1)Component :意图所要启动的组件
ComponentName有三种构造器:
(1)ComponentName(Context,Class)
(2)ComponentName(Context,String)
(3)ComponentName(String package,String clz)
其中用来表示类名的字符串必须使用全类名.包名只是用来区分android应用程序的。也可以启动不同android应用程序的activity
可以通过intent.setComponent(component)指定;也可以使用intent.setClass()和intent.setClassName()来指定要启动的组件,当然还可以使用new Intent(Context,Class)创建一个Intent出来,
缺点:它不能调用其他应用中的Activity.只能在同一应用程序之间进行跳转。

2、隐式意图:没有明确指定组件名的Intent为隐式意图,Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般用于不同应用程序之间的跳转。

Android系统使用IntentFilter来寻找与隐式相关的组件。举个例子,说白了意图就是启动一个组件的的完整的动作信息,就像打人,打就是Action动作,人就是Data内容,而Type就是类型,打什么人呢?打坏人,type就是坏指的类型,只有这些信息全了才能执行一个完整的意图.

三、Intent的各个属性的含义以及配置

(1)Action 动作
(2)Category 为Action增加额外的附加条件,一般将action和category结合使用
注意:一个要启动的意图只能设置一个Action,但可以有多个Category,但可以添加多个Category,而对于配置文件中的
intent-filter,可以配置多个Action也可以配置多个Category,要启动的组件只要满足其一就可启动它。
a)每一个通过 startActivity() 方法发出的隐式Intent都至少有一个 category,即默认的category : “android.intent.category.DEFAULT”,所以只要是想接收一个隐式Intent的Activity都应该包括 “android.intent.category.DEFAULT”的category,不然将导致 Intent匹配失败
b)一个至少应该包含一个,否则任何Intent请求都不能和该匹配。
若Intent请求的Action和中的某一个匹配,那么该Intent就通过这条的动作测试.
c)如果中没有包含任何Action类型,那么无论什么Intent请求都无法和这个匹配.
d)若Intent请求中没有设定Action类型,虽然中包含有Action类型,那么这个Intent请求不能通过
的测试
e)当Intent请求中包含的所有的Category与组件中某个IntentFilter的完全匹配时,才会让该
Intent请求通过测试.

练习:测试系统的Action–Intent.ACTION_DIAL,打开系统的拨打电话的界面。
如:给某个人打电话:添加打电话的权限
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);//打电话的动作
intent.setData(Uri.parse(“tel:123”));//具体的数据,打给123
startActivity(intent);
如:给10086发短信
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);// 发送信息的动作
intent.putExtra(“sms_body”, “The SMS text”); //发送短信的内容
intent.setData(Uri.parse(“sms:10086”));// 具体的数据,发送给10086
startActivity(intent);
(3)Data 向Action属性提供操作的数据,Data属性接受一个Uri对象。
URI统一资源标识符:在网络中或者本地如何找到一个唯一的资源的标识符
格式:协议://主机:端口号/资源路径
tel:10086 tel:主机 10086:端口号
sms:10086 sms:主机 10086:端口号
content://com.android.contacts/contacts/1
与uri类似的还有URL:统一资源定位符,把一个地址作为唯一的资源的标识符,
http://www.baidu.com
http:// 协议
www.baidu.com 域名
http://192.168.10.1:8080/index.html
ip 192.168.10.1决定服务器
端口号8080 决定运行程序
index.html 资源路径
URN统一资源命名符:定义一个唯一的名字,比如书的ISBN号

Activity配置时,使用设置其匹配的Data.一般情况下配置Activty可以有多个action,多个category,但是只能有一个data.
并且配置data之前需要先有action.

匹配:scheme://…

四、Intent的扩展:PendingIntent,延迟意图

1.概念

pendingIntent字面意义:延迟的intent,等待的,未决定的Intent。主要用来在某个事件完成后执行特定的Action。
pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。pendingIntent执行的操作实质上是参数传进来的Intent的操作,但是使用pendingIntent的目的在于它所包含的Intent的操作是需要满足某些条件后才能执行的。

2.获取的方式

要得到一个pendingIntent对象,调用PendingIntent类的静态方法获得:
getActivity(Context context, int requestCode, Intent intent, int flags)
getBroadcast(Context context, int requestCode, Intent intent, int flags)
getService(Context context, int requestCode, Intent intent, int flags)
分别对应着Intent的3个行为,分别返回跳转到一个activity组件、打开一个广播组件和打开一个服务组件的PendingIntent。
参数有4个,比较重要的是第一个和第三个,其次是第二个和第四个。
可以看到,要得到这个对象,必须传入一个Intent作为参数,必须有context作为参数。
其中第二个参数为请求码,有时为了避免影响之前的消息,requestCode每次要设置不同的内容。
第四个参数主要有:
FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent
取消,然后重新生成一个PendingIntent对象。
FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接
返回null。
FLAG_ONE_SHOT:该PendingIntent只能使用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动
调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。
FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用
该PendingIntent对象,但是会使用新的Intent来替换之前PendingIntent中的Intent对象数据,
例如更新Intent中的Extras,比较常用。

注意:对于Context的startActivity方法,如果不是在其子类(Activity)中调用,那么必须对Intent加上FLAG_ACTIVITY_NEW_TASK。

3.主要的用途

主要的使用的地方和例子:通知Notificatio的发送,短消息SmsManager的发送和警报器AlarmManager的执行等等。

4.Intent和PendingIntent的区别

a. Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
b. Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
c. PendingIntent自带Context,而Intent需要在某个Context内运行
d. Intent在原task中运行,PendingIntent在新的task中运行

0 0
原创粉丝点击