Intent——安卓系统里的信使
学习笔记,欢迎指教。
概述
△安卓系统不允许直接访问四大应用程序组件,Intent作为一个可以访问四大应用程序的机制存在,Intent可以在四大应用程序之间传递信息,或者说,四大组件通过他来传递信息。
△本文主要对Intent对象做基本简介,同时介绍其常用的各个属性。
Intent分类
△显式Intent(在Intent里指定想启动的组件名字)
△隐式Intent(没有指定要启动的组件名字)
使用案例(显式方式)
△使用Intent启动一个窗体:
→单纯启动一个窗体:
Intent intent = new Intent(A.this, D.class);//设置要请动的窗体
startActivity(intent);//启动
→当被启动窗体结束以后希望他能返回信息:
Intent intent = new Intent(A.this, D.class);
startActivityForResult(intent, requestCode);
△使用Intent启动一个服务:
→启动一个只执行一次操作的服务:
Intent intent = new Intent(A.this, D.class);
startService(intent);
→将服务与另外一个应用上的服务绑定:
Intent intent = new Intent(A.this, D.class);
bindService(intent);
△使用Intent发送广播
sendBroadcast(intent);
sendOrderedBroadcast(intent);
sendStickyBroadcast(intent);
注意:为了安全,不要使用隐式Intent启动一个服务,也不要为你的应用中的某个服务组件设置<intent-filter>,因为你不知道什么样的服务会被启动,而且用户也不知道什么服务被打开了(因为服务没有界面)
Intent对象可以封装和传递的信息
△组件名(component name)
△动作(Action)
△种类(Category)
△数据(Data)
△附加信息(Extra)
△标志(Flags)
各属性的相关介绍
△组件名字(component name)
这个没什么可说的,就是组件类名而已。
△在Intent里设置要启动的组件名字
→在Intent构造方法里面指定:
Intent myIntent = new Intent(this, 要访问的组件名字.class);
→使用相关方法指定:
intent.setComponent();
setClass(this,Class<?>);//与构造方法的使用没有什么区别
setClassName(Context, String className);
setClassName(String packageName, String className);
注:最后面的两个方法,类名是以字符串的形式传入,而且使用完整类名:包名+类名
Action介绍
△他是隐式启动的属性
△Action很大程度上决定了Intent做些什么,你可以定义自己的Action内容,但你应当经常使用Intent类已定义的内容。
△你可以这样理解,Intent就是告诉被启动的组件:“你给我听好了我要你做…………Action”
△几个系统已定义的Intent举例
→ACTION_VIEW:当你有某些信息需要某个窗体展示给用户,你将使用这个Action,比如一个需要地图软件来展示的地址。
→ACTION_SEND:当你有某些数据可以让用户通过其他应用分享出去,你将使用这个Action,比如你要分享某些数据通过一个邮件应用,或者一个社交应用。
注:Action的值是一个字符串,系统指定那些其实也是字符串的常量。
△为Intent指定Action的方式:
→构造函数
→intent.setAction()方法
注:又该方法可以看出,一个Intent对象只能指定一个Action。
△当你自定义了一个Action,请确定他以你自己应用包名作为前缀,这样可以防止与系统的重复,比如:
static final String ACTION_MYACTUON = “包名.MYACTION”;
Category介绍
△概述:本质上与Action一样,也是一个字符串,Action与Category都描述了要访问的组件(隐式访问)做些什么,你可以将他理解成对Action的补充说明,使Intent对其与访问的组件描述更加详细。可以为一个Intent添加任意数量的Category。(比如你要对别的组件说:“我要你做…………Action,详细地说就是要你…………Category”)
△同样,你可以定义自己的Category,系统也为你提供了一些已定义的Category。
△一些常用Category:
→CATEGORY_BROWSABLE:表示该窗体可以被网页浏览器应用启动,该窗体可以展示由网页上某个链接所指示的数据。
→CATEGORY_LAUCHER:该窗体是某个应用被启动时所显示的首个窗体,而且该窗体将被显示在系统应用程序列表。
△设置(增加)Category:addCategory方法。每次调用这个方法,都为Intent对象增加一个新的Category。
Data
△概述:他与Action、Category并称安卓三大事件过滤机制,Data不是简单地通过字符串对比进行匹配,而是按着一定规则进行匹配:Data根据两个属性进行匹配:MIME Type、URI。
→URI:通过Intent传递资源(比如一个文本文件或者一个图片文件),不是直接将资源给发出去的,发送那方通过一个URI来指定资源,接收方则通过这个URI来访问那个资源,安卓上的任何资源都可以以URI的形式表示。
→MIME Type:他描述了资源类型(通过字符串的形式描述)。比如:”image/*”,”text/plain”,这些都是合法的
△如何设置两个方式:
→纯粹的设置URI:intent.setData();
→纯粹的设置Type:intent.setType();
→同时设置上述两个:intent.setDataAndType();
→注意:当你使用前面两个方法,他在设置其中一个那时会将另外一个清空(即将另外一个设置为null)
上述所说四个属性(组件名字,Action,Category,Data都是用来描述一个Intent,系统通过他们知道应当启用哪个组件处理Intent)。
Extras介绍
△概述:
→里面存放着键值对。
→这些键值对就是被启动那个窗体要处理的数据。
→说白了就是他可以带着你的数据去给被启动的那个窗体。
△如何向里面增加数据
→直接将数据放进去:putExtra(“键”,”值”);
→创建Bundle包,将所有的数据放进Bundle包里,将Bundle发出去:putExtras(bundle);
△注意:
→里面的“键”可以是系统已定义好的,Intent类已经定义了很多的“键”他们总是这样子的常量:EXTRA_*;如果你要定义你自己的Extra,你应该将你的包名作为前缀,比如:
stativ ginal String EXTRA_MYEXTEA = “包名.EXTRA_MYEXTRA”;
同样,这样做是为了能够和系统的不会重复。
→其实即使你不创建Bundle包,在你往里面放数据那时,系统也会自动给你创建Bundle的。
Flags
△他可以控制被启动组件的行为,比如,被启动的那个组件隶属哪个任务,当被启动那个窗体关闭之后,是否放入最近启动的列表里。
附:
注意:你的隐式Intent可能会找不到能被启动的那个组件(如果设备里面没有能处理你所指示的任务的应用,此时如果执行启动,你的应用将会崩溃,所以,你应该在启动之前进行判定)。调用方法:
intent.resolveActivity(getPackagemanager())!==null;
如果该方法返回值不是空的,表示当前设备里面有应用能处理你的Intent。