首页 > 代码库 > 基础篇:5.熟练掌握Intent机制
基础篇:5.熟练掌握Intent机制
前言
在讲解Intent之前,先来回顾下之前在哪些方面接触过这东西:
(1)启动Activity:startActivity(Intent intent); startActivityForResult(Intent intent);
(2)发送广播: Context.sendBroadcast(Intent intent); Contxt.sendOrderBroadcast(Intent intent);
(3)启动或绑定Service: Context.startService(Intent intent); Context.bindService(Intent intent);
由此可见,android的三大组件都是通过Intent进行激活和各组件间进行数据传输,那么何为Intent?!
Intent简介
Intent是android程序中传输数据的核心对象,Intent在官方文档中的定义为:执行某操作的一个抽象描述。这个定义理解起来不是很直观。个人更喜欢这个定义:Intent负责对应用中一次操作的动作、动作涉及的数据、附加数据进行描述。Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
Intent构成
(1)ComponentName
组件名称用来指定为处理Intent对象的组件,可以通过以下三种方法进行设置:
a) intent.setComponent(SecondActivity) 参数为要设置的组件名称
b) intent.setClass(MainActivity.this,SecondActivity.class) 第一个参数为当前Activity的this对象,第二个参数为要打开的Activity的class对象
c) intent.setClassName(MainActivity.this,SecondActivity) 第一个参数为当前Activity的this对象,第二个参数为要打开的Activity类对象
(2)Action
用来指明要实施的动作是什么,很大程度上决定了Intent的构建,一些常用的动作如下:
ACTION_CALL activity 启动一个电话.
ACTION_EDIT activity 显示用户编辑的数据.
ACTION_MAIN activity 作为Task中第一个Activity启动
ACTION_SYNC activity 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.
除了官方给出的一些常用动作外,用户也可以自定义自己的动作,自定义动作字符串应包含程序包名的前缀,如com.example.alarm.xxx
设置动作: intent.setAction(String action) 获取动作: intent.getAction(String action)
(3)Data
数据是作用在Intent上的数据的URI(通用资源标示符)和数据的MIME类型(已注册的数据类型主要有:application,audio,example,message,model,multipart,text,video),不同的动作有不同的数据规格。
设置数据:intent.setData(Uri.parse("tel:18620390143"))//设置要拨打的号码
(4)Extra
附加数据用来为Intent添加附加信息:
设置附加数据: intent.setExtra("name","张光源") 第一个参数为附加信息名称,第二个参数为附加信息值
获取附加数据: intent.getExtra("name") 根据附加信息名称,获取相应数据值
(5)IntentFilter
隐式Intent(并不指明目标组件名称)需要通过过滤器<intent-filter>进行解析,一个过滤器对英语Intent对象的动作、数据、种类,过滤器需要检测隐式Intent的这三个字段,其中任何一个失败,则为解析失败。然而一个组件可以拥有多个过滤器,在这个过滤器上解析失败,有可能在其它过滤器解析成功。过滤器的使用如下:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <data android:mimeType="video/mpeg" android:scheme="http"> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
目前所接触到的Intent操作都是显式Intent(指定compoment),所以对Intent的解析方面了解还不够深入,待后期有更深理解再进行补充。
附:经常接触的Intent实例:
Intent intent=new Intent(MainActivity.this,MyAlarmReceiver.class);//指定跳转的Inetent intent.setAction("com.example.action.setalarm");//指定intent的action sender=PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);//指定PendingIntent
Intent it=new Intent(context,AlarmMessage.class);//定制要跳转的activity it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 传递一个新的任务标记 context.startActivity(it);//启动Intent