android中的intent
来源:互联网 发布:mysql order by limit 编辑:程序博客网 时间:2024/05/29 14:54
Android应用中的三个核心组件:Activities,Services和broadcastreceivers都是通过Intent来触发的,当它们触发的机制各不相同,而且不会有重叠,也就是说发给Activity的Intent不会激活Service或是broadcastreceivers,发给broadcastreceivers的Intent也不会触发Activity和Service。
1. Activity通过方法 Context.startActivity() 和Activity.startActivityForResult()来调用。以函数调用为参考startActivity() 相当于调用无返回值的函 数,startActivityForResult()调用的Activity有返回值,可以通过Activity.setResult()来返回结果。
2. Context.startService()用来初始化Service,Context.bindService()可以用来建立与目标Service之间的连接,如果Service没有运行,则会启动该Service。
3. BroadcastReceiver是通过 Context.sendBroadcast(), Context.sendOrderedBroadcast(), 和Context.sendStickyBroadcast()来触发的。大部分的Broadcast消息来自于Android操作系统,如电池状态,来 电,短消息等。
下面来看看AndroidOS如何根据Intent来找到满足触发条件的Activity,Service或是BroadcastReceiver. 借用SQL 数据库的概念可以更好的理解。
SELECT(Activitives|Services|Broadcast Receivers) AS Target
FROM (List in AndroidManifest.xml)
WHERE Intent Meet Target’s (Intent Filter)
意思就是从AndroidManifest.xml中定义的Activities,Services和BroadcastReceiver列表中查找符合Intent条件的Activities,Services,或是BroadcastReceivers。所有能活被激活的Activity,Service和BroadcastReceiver都必须在AndroidManifest.xml有定义,否则AndroidOS无法查询到该目标,相当于数据库中无记录,即使你在代码中定义了该Activity,Service或BroadcastReceiver。
Intent
Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。它主要包含下列信息:
Component name:可以处理该Intent的组件名称,组件名称指定义Activity,Service 的包和类的全名称。比如类名为com.pstreets.gisengine.AndroidGISEngineTutorial,包名为com.pstreets.gisengine。 组件名称为可选项,如果指定了,意味明确指定用来响应该Intent的Activity,Service。
Action: 列出需要执行的操作名称。或者在Broadcast Intents的情况下给出发生的事件名称。
Constant
Target component
Action
ACTION_CALL
activity
开始打电话.
ACTION_EDIT
activity
显示编辑对话框.
ACTION_MAIN
activity
作为一个任务(应用)的起始Activity,对于可以从Android应用列表的应用来说,都需要在AndroidManifest.xml 中设置ACTION_MAIN的Intent-Filter属性。
ACTION_SYNC
activity
同步数据.
ACTION_BATTERY_LOW
broadcast receiver
电池电量低告警.
ACTION_HEADSET_PLUG
broadcast receiver
耳机插入或拔出.
ACTION_SCREEN_ON
broadcast receiver
屏幕打开或关闭.
ACTION_TIMEZONE_CHANGED
broadcast receiver
时区变动.
Data:定义不数据的URL以及数据的MIME类型。不同的Action能够处理的Data类型也不一样,比如 ACTION_CALL,它处理的数据格式为tel: URI,URI为电话号码。
Category: 定义了可以响应Intent的附加信息,一个Intent可以指定多个Category类型。和Action类似,Android预定义了一些Category类型:
Constant
Meaning
CATEGORY_BROWSABLE
表示目标Activity可以使用浏览器安全显示指定连接,比如说一个图片或是Email消息.
CATEGORY_GADGET
表示该Activity可以当作一个Gadget嵌入到其它可以放置Gadget的Activity中。
CATEGORY_HOME
表示还Activity是Home Screen,可以设置这个属性来替换Android自带的Home Screen。
CATEGORY_LAUNCHER
该Activity可以显示在Android程序管理器中。一般应用的主Activity都会在AndroidManifest.xml 定义该属性。
Extra: 附加Key-Value列表,可以向目标Activity传送附加参数。可以理解成函数调用时的参数。
Flags:指出Android启动目标Activity时的一些选项(比如目标Activity隶属于那个应用等)。
除非是Intent明确指定目标(Explicitly)Activity的类和包名称,这是Activity无需在 AndroidManifest.xml定义intent-filter,其它情况也叫隐含(Implicit)方式启动目标Activity,在这种情 况下Android操作系统查找目标Activity,Service或是BroadcastReceiver时主要根据Intent 的Action,Data和Category属性来匹配定义在AndroidManifest.xml中 Activity,Service或是Broadcast Receiver的Intent Filters。
Intent Filters
Android中没个有效的Activity,Service,BroadcastReceiver都必须在AndroidManifest.xml有对应的定义。除非只使用明确调用发生来启动目标Activity,每个Activity都需要定义一个intent-filter。下面是是明确指定目标Activity的示例代码:
- Intent intent=new Intent(SplashActivity.this,GNavigator.class);
- startActivity(intent);
而更一般的情况,Activity在AndroidManifest.xml具有如下定义:
- <activity android:name=”.AndroidGISEngineTutorial”
- android:label=”@string/app_name”>
- <intent-filter>
- <action android:name=”android.intent.action.MAIN” />
- <action android:name=”com.example.project.SHOW_CURRENT” />
- <action android:name=”com.example.project.SHOW_RECENT” />
- <action android:name=”com.example.project.SHOW_PENDING” />
- ….
- <category android:name=”android.intent.category.DEFAULT” />
- <category android:name=”android.intent.category.BROWSABLE” />
- …
- <data android:mimeType=”video/mpeg” android:scheme=”http” . . . />
- <data android:mimeType=”audio/mpeg” android:scheme=”http” . . . />
- ….
- </intent-filter>
- </activity>
Activity的intent-filter可以包含action,category,data 子元素,给出了该Activity能够处理的Intent的Action,Category和数据类型。Android操作系统就是根据Activity的intent-filter来匹配Intent,从而触发目标Activity,或是Service,BroadcastReceiver。
最常见的一个IntentFilter组合如下:
- <intent-filter . . . >
- <action android:name=”code android.intent.action.MAIN” />
- <category android:name=”code android.intent.category.LAUNCHER” />
- </intent-filter>
表示用户可以从Android设备的应用程序管理器启动该Activity,这个Activity为应用的主Activity,主Activity可以再使用Intent触发或是启动其它Activity。
- Android中的intent
- 【转】Android中的Intent
- Android中的Intent
- Android中的Intent
- Android中的Intent
- Android中的Intent总结
- Android中的Intent
- Android 中的Intent
- android中的intent
- Android中的Intent
- Android中的Intent
- android 中的意图intent
- Android中的Intent详解
- Android 中的 Intent
- android中的intent
- Android中的intent
- android中的activity---intent
- Android中的Intent详解
- c++ 一个头文件引用另一个头文件的类
- 项目名字还没有想好,待定
- Linux中跨网段ping问题
- linux命令 dd
- Android-Universal-Image-loader源码解析
- android中的intent
- MongoDB:逐渐变得无关紧要
- C#和Java时间字符串的毫秒字符不同
- UIbutton 防止重复点击
- jvm学习笔记一(java内存区域)
- 学习新东西的唯一方法
- struct 和typedef struct
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
- oracle优化:避免全表扫描