Intent使用小结
2015-09-03 08:23
381 查看
一、Intent简介:Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
二、Intent的功能:启动活动、启动服务、发送广播等等
三、显示意图和隐式意图
1.显示意图:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显示Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。
2.隐式意图:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
Android系统寻找与Intent请求意图最匹配的组件具体的选择方法 是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。
如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
Android如何知道应用程序能够处理某种类型的Intent请求呢?这需要应用程序在Android-Manifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。
一个没有声明Intent-Filter的组件只能响应指明自己名字的显示Intent请求,而无法响应隐式Intent请求。
而一个声明了IntentFilter的组件既可以响应显示Intent请求,也可以响应隐式Intent请求。在通过和 IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准:
Action
Data
Category
—->intent 的setData()方法中的参数类型是Uri格式(可以看一看MIME格式的定义)
MIME:http://baike.baidu.com/link?url=37nGvdZ18j73c6ktJ9H7ZqsadX3CIt9yji_s25TpGOhhJirnXaAMUNXoiRwqUrg6YVfiY1BsZFsDbOVTqXudJq
四、通过Intent传值:
1.普通方式:
2.传递对象:
2.1 Serializable方式
序列化,讲一个对象转化成可存储或可传输的状态,序列化的对象可以在网络上进行传输,也可以存储到本地,操作只用让一个类去实现Serializeable接口.
2.2 Parcelable方式
与Serializable方式不同,Parcelable方式实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
实现方式比Serializable稍微复杂一点:
1)实现Parcelable接口
2)重写describeContents()方法和writeToParcel(..)方法
3)提供一个CREATOR 常量,重写createFromParcel()方法和newArray()方法
3.两种方式对比
Serializable的方式比较简单,但是由于会把整个对象进行序列化,因此效率会比Parcelable方式低一些。
源码实例
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
二、Intent的功能:启动活动、启动服务、发送广播等等
三、显示意图和隐式意图
1.显示意图:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显示Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。
//显式意图第一种方式 //Intent intent = new Intent(this,TargetActivity.class); //显式意图第二种方式 //Intent intent = new Intent(); //intent.setClass(this, TargetActivity.class); //intent.setClassName(this, "com.bei_ing.TargetActivity"); //intent.setClassName("com.bei_ing", "com.bei_ing.TargetActivity"); //显式意图第三种方式 Intent intent = new Intent(); //ComponentName component = new ComponentName(this, TargetActivity.class); //ComponentName component = new ComponentName(this, "com.bei_ing.TargetActivity"); ComponentName component = new ComponentName("com.bei_ing", "com.bei_ing.TargetActivity"); intent.setComponent(component); startActivity(intent); //开启一个服务 startService(intent); //发送一个广播 sendBroadcast(intent);
2.隐式意图:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
Android系统寻找与Intent请求意图最匹配的组件具体的选择方法 是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。
如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
Android如何知道应用程序能够处理某种类型的Intent请求呢?这需要应用程序在Android-Manifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。
一个没有声明Intent-Filter的组件只能响应指明自己名字的显示Intent请求,而无法响应隐式Intent请求。
而一个声明了IntentFilter的组件既可以响应显示Intent请求,也可以响应隐式Intent请求。在通过和 IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准:
Action
Data
Category
Intent intent = new Intent(); intent.setAction("action"); intent.setAction("hello.world"); intent.addCategory("category); startActivity(intent);//该方法默认加入了 category: android.intent.category.DEFAULT,所以在配置文件必须要加盖属性 //调用系统的拨打电话的功能 public void call(View v) { Intent intent = new Intent(); intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel://120")); startActivity(intent) } //调用系统的发送短信的功能 public void send(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto://18612346789")); startActivity(intent); } //调用系统的播放音乐的功能 public void play(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://mnt/sdcard/mp1.mp3"), "audio/mp3"); startActivity(intent); }
—->intent 的setData()方法中的参数类型是Uri格式(可以看一看MIME格式的定义)
MIME:http://baike.baidu.com/link?url=37nGvdZ18j73c6ktJ9H7ZqsadX3CIt9yji_s25TpGOhhJirnXaAMUNXoiRwqUrg6YVfiY1BsZFsDbOVTqXudJq
四、通过Intent传值:
1.普通方式:
//普通传值,普通类型如int String float double boolean intent.putExtra("name", "小白"); // intent.putExtra("isOk", true); intent.putExtra("age", 20); //intent.putExtra("float", 99.9f); //intent.putExtra("double", 99.9);
2.传递对象:
2.1 Serializable方式
序列化,讲一个对象转化成可存储或可传输的状态,序列化的对象可以在网络上进行传输,也可以存储到本地,操作只用让一个类去实现Serializeable接口.
class Dog implements Serializable{ String name; int age; @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } } 传值: Dog dog = new Dog(); dog.name = "小白"; dog.age = 1; intent.putExtra("dog", dog);//直接传 //Bundle bundle = new Bundle();//传bundle对象 //bundle.putSerializable("dog", dog); //intent.putExtras(bundle); 接收: Dog dog = (Dog) intent.getSerializableExtra("dog");//直接获取所传对象 //Bundle bundle =intent.getExtras();//接收一个bundle对象 //Dog dog = (Dog) bundle.get("dog");//再从bundle对象中获取
2.2 Parcelable方式
与Serializable方式不同,Parcelable方式实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
实现方式比Serializable稍微复杂一点:
1)实现Parcelable接口
2)重写describeContents()方法和writeToParcel(..)方法
3)提供一个CREATOR 常量,重写createFromParcel()方法和newArray()方法
class Cat implements Parcelable{ String name; int age; @Override public String toString() { return "Cat [name=" + name + ", age=" + age + "]"; } @Override public int describeContents() { return 0;//直接返回0即可 } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name);//写出名字 dest.writeInt(age);//写出年龄 } public static final Parcelable.Creator<Cat> CREATOR = new Creator<Cat>() { @Override public Cat[] newArray(int size) { return new Cat[size]; } @Override public Cat createFromParcel(Parcel source) { Cat cat = new Cat(); cat.name = source.readString();//读取name cat.age = source.readInt();//读取age return cat; } }; } 传值:和Serializable没两样 Cat cat = new Cat(); cat.name = "花花"; cat.age = 1; intent.putExtra("cat", cat); 接收: Cat cat = intent.getParcelableExtra("cat");
3.两种方式对比
Serializable的方式比较简单,但是由于会把整个对象进行序列化,因此效率会比Parcelable方式低一些。
源码实例
相关文章推荐
- POJ 1654 Area(计算几何)
- c++ primer读书笔记之c++11(二)
- Java简易计算器
- 150903_工具_eclipse_res文件夹
- 机房管理系列(1) 联想保护系统EDU7.5在同传CMOS参数后奔溃的解决办法
- Google如何欺骗用户分享地理位置信息
- Oracle数据泵导入导出案例
- AI (Adobe Illustrator)详细用法(一)
- HDU 5308 I Wanna Become A 24-Point Master(模拟+数论)
- hdu 1176 免费馅饼(数塔类型)
- 已解——navicat premium 连接oracle 11g,出现no listener提示
- Java集合
- linux系统启动流程
- MOOC数据结构-01-复杂度1 最大子列和问题 (20分)
- LFS过程问题解决
- #用Python直接写UTF-8文本文件
- CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)
- php 性能优化 笔记
- JavaSE---IO流基础(异常、File类、递归)
- CentOS下SVN安装及配置图解教程