Intent
来源:互联网 发布:什么软件有电视直播 编辑:程序博客网 时间:2024/04/29 00:18
Intent的介绍
Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
Inten启动组件的方法
Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。具体方法如下:
组件名称
方法名称
Activity
startActvity( )
startActivityForResult( )
Service
startService( )
bindService( )
Broadcasts
sendBroadcasts( )
sendOrderedBroadcasts( )
sendStickyBroadcasts( )
Intent的属性
Intent有以下几个属性:动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展(Extra)。其中最常用的是Action属性和Data属性。
Action(动作)
Action是指Intent要完成的动作,是一个字符串常量。SDK中定义了一些标准的Action常量如下所示。
标准的Activity Actions
ACTION_MAIN:作为一个主要的进入口,而并不期望去接受数据
ACTION_VIEW:向用户去显示数据
ACTION_ATTACH_DATA :用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人
ACTION_EDIT:访问已给的数据,提供明确的可编辑
ACTION_PICK:从数据中选择一个子项目,并返回你所选中的项目
ACTION_CHOOSER:显示一个activity选择器,允许用户在进程之前选择他们想要的
ACTION_GET_CONTENT :允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)
ACTION_DIAL :拨打一个指定的号码,显示一个带有号码的用户界面,允许用户去启动呼叫
ACTION_CALL:根据指定的数据执行一次呼叫
(ACTION_CALL在应用中启动一次呼叫有缺陷,多数应用ACTION_DIAL,ACTION_CALL不能用在紧急呼叫上,紧急呼叫可以用ACTION_DIAL来实现)
ACTION_SEND:传递数据,被传送的数据没有指定,接收的action请求用户发数据
ACTION_SENDTO :发送一个信息到指定的某人
ACTION_ANSWER:处理一个打进电话呼叫
ACTION_INSERT :插入一条空项目到已给的容器
ACTION_DELETE:从容器中删除已给的数据
ACTION_RUN:运行数据,无论怎么
ACTION_SYNC:同步执行一个数据
ACTION_PICK_ACTIVITY :为已知的Intent选择一个Activity,返回别选中的类
ACTION_SEARCH:执行一次搜索
ACTION_WEB_SEARCH:执行一次web搜索
ACTION_FACTORY_TEST:工场测试的主要进入点
标准的广播Actions
ACTION_TIME_TICK:当前时间改变,每分钟都发送,不能通过组件声明来接收,只有通过Context.registerReceiver()方法来注册
ACTION_TIME_CHANGED:时间被设置
ACTION_TIMEZONE_CHANGED:时间区改变
ACTION_BOOT_COMPLETED:系统完成启动后,一次广播
ACTION_PACKAGE_ADDED:一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)
ACTION_PACKAGE_CHANGED:一个已存在的应用程序包已经改变,包括包名
ACTION_PACKAGE_REMOVED:一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)
ACTION_PACKAGE_RESTARTED:用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)
ACTION_PACKAGE_DATA_CLEARED:用户已经清楚一个包的数据,包括包名(清除包程序不能接收到这个广播)
ACTION_BATTERY_CHANGED:电池的充电状态、电荷级别改变,不能通过组件声明接收这个广播,只有通过Context.registerReceiver()注册
ACTION_UID_REMOVED:一个用户ID已经从系统中移除
下面是一个测试Action常量的例子:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);// 设置Intent Action属性
intent.setType("vnd.android.cursor.item/phone");// 设置Intent Type 属性
//主要是获取通讯录的内容
startActivity(intent); // 启动Activity
Data(数据)
Intent的Data属性是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。比如:ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应用应该和要显示的URI匹配。
Category(范畴)
Intent中的Category属性是一个执行动作Action的附加信息。比如:CATEGORY_HOME则表示放回到Home界面,ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个。下表是SDK文档中关于Category的信息。
Constant
Meaning
CATEGORY_BROWSABLE
The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message.
CATEGORY_GADGET
The activity can be embedded inside of another activity that hosts gadgets.
CATEGORY_HOME
The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.
CATEGORY_LAUNCHER
The activity can be the initial activity of a task and is listed in the top-level application launcher.
CATEGORY_PREFERENCE
The target activity is a preference panel.
下面是一个回到Home界面的例子:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_MAIN);// 添加Action属性
intent.addCategory(Intent.CATEGORY_HOME);// 添加Category属性
startActivity(intent);// 启动Activity
Type(类型)
Intent的Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
Compent(组件)
Intent的Compent属性指定Intent的的目标组件的类名称。通常 Android会根据Intent中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
Extra(附加信息)
Intent的Extra属性是添加一些组件的附加信息。
Intent intent =new Intent();
//设置Intent的class属性,跳转到SecondActivity
intent.setClass(FirstActivity.this, SecondActivity.class);
//为intent添加额外的信息
intent.putExtra("useName",etx.getText().toString());
//启动Activity
startActivity(intent);
//获得Intent
Intent intent =this.getIntent();
tv = (TextView)findViewById(R.id.TextView1);
//从Intent获得额外信息,设置为TextView的文本
tv.setText(intent.getStringExtra("useName"));
Flags(标志位)
能识别,有输入,整个Intent基本就完整了,但还有一些附件的指令,需要放在Flags中带过去。顾名思义,Flags是一个整形数,有一些列的标志位构成,这些标志,是用来指明运行模式的。比如,你期望这个意图的执行者,和你运行在两个完全不同的任务中(或说进程也无妨吧...),就需要设置FLAG_ACTIVITY_NEW_TASK的标志位。
Android的一个特色就是applicationA的activity可以启动 application B的activity,尽管A和B是毫无干系的,而在用户看来,两个场景紧密联系,视觉上二者构成了一个整体。Android就是把这种误觉定义为Task,它既不是Class,也不是AndroidMainifest.xml中的一个元素。从表现上看Task就像是一个stack,一个一个的activity是构成stack的元素,做着入栈(push)和出栈(pop-up)这样简单重复性的劳动。
默认的规则总是满足大多数的应用场景,但是也总会有一些例外打破习以为常的惯例。Task的默认规则同样并非牢不可破,修改的方法还是有的。借助Intent中的flag和AndroidMainifest.xml中activity元素的属性,就可以控制到Task里Activity的关联关系和行为。
在 android.content.Intent 中一共定义了20种不同的 flag,其中和 Task紧密关联的有四种:
Ø FLAG_ACTIVITY_NEW_TASK
Ø FLAG_ACTIVITY_CLEAR_TOP
Ø FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Ø FLAG_ACTIVITY_SINGLE_TOP
在使用这四个flag时,一个Intent可以设置一个flag,也可以选择若干个进行组合。
默认情况下,通过startActivity()启动一个新的Activity,新的 Activity将会和调用者在同一个stack中。但是,如果在传递给 startActivity()的Intent对象里包含了FLAG_ACTION_NEW_TASK,情况将发生变化,系统将为新的Activity“寻找”一个不同于调用者的 Task。不过要找的Task是不是一定就是NEW呢?如果是第一次执行,则这个设想成立,如果说不是,也就是说已经有一个包含此Activity的Task存在,则不会再启动一个新Activity。
如果flag是FLAG_ACTIVITY_CLEAR_TOP,同时当前的Task里已经有了这个Activity,那么情形又将不一样。Android不但不会启动新的Activity实例,而且还会将Task里该Activity之上的所有Activity一律结束掉,然后将Intent发给这个已存在的Activity。Activity 收到Intent之后,可以在onNewIntent()里做下一步的处理,也可以自行结束然后重新创建自己。如果Activity在AndroidMainifest.xml里将启动模式设置成multiple(默认模式),并且Intent里也没有设置FLAG_ACTIVITY_SINGLE_TOP,那么它将选择后者。否则,它将选择前者。FLAG_ACTIVITY_CLEAR_TOP还可以和FLAG_ACTION_NEW_TASK配合使用。
如果 flag 设置的是FLAG_ACTIVITY_SINGLE_TOP,则意味着如果Activity已经是运行在Task的top,则该Activity将不会再被启动。
intent的解析
在应用中,我们可以以两种形式来使用Intent:
显式:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
隐式:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的applicationpackage的信息) 来查找能过处理这个Intent的component。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme(比如http:或者 mailto:)进行匹配。同上,Intent的scheme必须出现在目标组件的scheme列表中。
如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
整理自:
http://www.cnblogs.com/hnrainll/archive/2012/01/11/2319818.html
http://www.cnblogs.com/devinzhang/archive/2012/01/17/2324778.html
- intent
- Intent
- Intent
- Intent
- intent
- Intent
- intent
- Intent
- Intent
- Intent
- Intent
- Intent
- Intent
- intent
- Intent
- intent
- Intent
- intent
- 一个进程(Process)最多可以生成多少个线程(Thread)
- c++ 函数整理
- 用于不相交集合的数据结构(算法导论第21章-并查集)
- ubuntu下deb包安装说明
- 开发者技术落后、跟不上时代只能怪自己,别牵拖公司没栽培你
- Intent
- 不安装Office操作Excel文件(.xlsx)
- Unix:(提纲)关于目录和文件的操作
- Linux进程学习笔记
- c内存泄漏检查
- 辛星跟您玩转vim第一节之vim的下载与三种模式
- C++11新特性中随机数产生新方法
- Sublime Text 2 实用快捷键[Mac OS X]
- mr任务之从多个Hbase表中读取数据进行处理