您的位置:首页 > 移动开发 > Android开发

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

2016-07-24 01:45 423 查看

一、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中运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息