[转]Android基本组件


Basic Components

1. Activity
2. Service
3. Broadcast Receiver
4. Content Provider
5. Intent
Activity——应用表示层(基类Activity)
应用程序中的每个屏幕都是通过继承和扩展基类Activity来实现的。
同一应用中的每个Activity是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个Activity(默认窗口),而后可以根据需要从这个Activity启动另一个新的Activity。
Activity利用View来实现应用中的GUI(用户直接通过GUI和应用程序做交互)。Activity窗口内的可见内容通过基类View提供。使 用Activity.setContentView()方法设置当前Activity中的View对象。

l 每个View对象控制着窗口内的一个矩形空间;
l View是一种层次化结构,Parent View中的布局属性会被子View继承;
l 位于View层次关系最底层的子View对象所代表的矩形空间就是跟用户进行交互的地方
Activity状态回调:
l onCreate
l onStart
l onRestart
l onResume
l onPause
l onStop
l onDestroy
Service——没有可见的用户界面,但能够长时间运行于后台(基类Service)
运行于应用程序进程的主线程中,因此Service不会阻塞其他组件和用户界面。
Service是不能自己启动的,必须通过Context对象(如一个Activity)调用startService或bindService方法来启动(用这两种方法启动的Service的生命周期不同)。
1. 调用startService方法
a) 若Service没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。
b) 若Service已经启动,则会直接调用onStart方法
c) 该方法启动的Service,可以通过Context对象调用stopService来关闭,也可以通过Service自身调用stopSelf()或stopSelfResult()来关闭,关闭之前调用onDestory方法。
2. 调用bindService方法,使当前Context对象通过一个ServiceConnection的对象绑定到所指定的Service
a) 若Service没有启动,则首先会调用该Service的onCreate方法初始化启动,然后调用Service的onBind方法初始化绑定。
b) 如果绑定Service的Context对象被销毁时,被绑定的Service也会调用onUnbind 和 onDestroy方法停止运行
c) 注意: BroadcastReceiver是不能绑定服务的。
d) 一个绑定Service的Context对象还可以通过unbindService()来取消对服务的绑定。
e) 取消时,Service会调用unbind方法,若Service是通过bindService来启动的,还会调用onDestroy方法来停止服务。
Service状态回调:
l onCreate
l onStart
l onBind
l onRebind
l onUnbind
l onDestroy
Broadcast Receiver ——用户接收广播通知的组件(基类BroadcastReceiver)
Android中的广播要么来自于系统,要么来自普通应用程序。
很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。
来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。
为了响应不同的事件通知,应用程序可以注册不同的Broadcast Receiver。所有的Broadcast Receiver都继承自基类BroadcastReceiver。
BroadcastReceiver自身并不实现图形用户界面,但是当它收到某个通知后,BroadcastReceiver可以启动Activity作为响应,或者通过NotificationMananger提醒用户。
BroadcastReceiver是对发送出来的Broadcast进行过滤接收并响应的一类组件。
发送Broadcast信息
1. 把要发送的信息和用于过滤得信息(如Action、Category)装入一个Intent对象
2. 调用Context.sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast()方法,广播该Intent对象
3. 使用sendBroadcast() 或sendStickyBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法;
4. 而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行
5. sendStickyBroadcast()方法主要的不同是,Intent在发送后一直存在,并且在以后调用registerReceiver()注册相匹配的Intent时会把这个Intent直接返回。
6. 若在使用sendBroadcast()方法时指定了接收的权限,这只有在AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来Broadcast。
7. 若在注册BroadcastReciever时,指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才有可能被这个 BroadcastReceiver所接收。
接收Broadcast消息
1. 继承BroadcastReceiver 类,并实现onReceive方法
2. 注册Broadcast Receiver(有2种方法:一种方法是,静态地在AndroidManifest.xml中用<receiver>标签声明,并在标签内 用<intent-filter>标签设置过滤器; 另一种方法,动态地在代码中先定义并设置好一个IntentFilter对象,然后再需要注册的地方调用 Context.registerReceiver()方法) (取消注册时,调用Context.unregisterReceiver()方法)

Content Provider —— 为解决应用程序间数据通信、共享的问题(基类ContentProvider)
在Android中,每个应用程序都是用自己的用户ID并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。
Content Provider可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是Android文件系统、SQLite数据库或者其他合理的方式。
当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver, 然后传入响应的URI就可以了。
Content Provider 继承自基类ContentProvider,并且实现了一组标准接口。通过这组接口,其他应用程序能对数据进行读写和存储。然而,需要使用数据的应用程序 并不是直接调用这组方法,而是通过调用ContentResolver对象的方法来完成。ContentResolver对象可以与任意 ContentProvider通信。
要为当前应用程序的私有数据定义URI,就需要专门定义一个继承自ContentProvider的类,然后根据不同的操作调用的方法去实现这些方法的功能。
ContentResolver类为应用程序提供了接入Content机制的方法。要构造一个ContentResolver对象可以为构造方法 ContentResolver(Context context)传入一个Context对象,也可以直接通过Context对象调用getContentResolver()方法获得 —— 有的ContentResolver对象后,就可以通过调用其query()、insert()、update()等方法来对数据进行操作了。
一旦需要以上4种Android应用程序基本组件完成请求,Android会首先确认该组件所在进程是否运行,如果没有运行,Android将先启动进程,同时确认被请求组件的实例是否存在,否则将创建一个新的组件实例。

Intent —— 连接组件的纽带
以上4种基本组件中,除了Content Provider是通过Content Resolver激活外,其他3种组件Activity、Service和Broadcast Receiver都是由Intent异步消息激活的。
Intent在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此,Intent是包含具体请求信息的对象。
针对不同的组件,Intent所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递Intent的不同方式。
Intent是一种运行时绑定(runtime binding)机制,它能够在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表到某种请求或者意愿,Android会根据意愿的内容选择适当的组件来处理请求。
l 激活一个新的Activity,或者让一个现有的Activity执行一个新的操作,可以通过调用如下两种方法(这两汇总方法需要传入的Intent参数称为Activity Action Intent):
1. Context.startActivity()
2. Activity.startActivityForResult()
l 启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:
1. Context.startService()
2. Context.bindService()
l 发送广播Intent(所有已注册的拥有与之相匹配IntenFilter的BroadcastReceiv就会被激活),可以调用如下三种方法:
1. Context.sendBroadcast()
2. Context.sendOrderBroadcast()
3. Context.sendStickBroadcast()

Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity、Service或BroadcastReceiver作响 应。所以,不同类型的Intent消息不会出现重叠,BroadcastIntent消息只会发送给BroadcastReceiver,而绝不可能发送 给Activity或Server。有startActivity()传递的消息也只可能发送给Activity,由startService()传递的 Intent只可能发送给Service。

Intent对象抽象地描述了执行操作,Intent的主要组成部分;
1. 目标组件名称。[可选项]
a) 组件名称是一个ComponentName对象,是目标组件类名和目标组件所在应用程序包的组合
b) 组件中的包名不一定要和manifes文件中包名完全匹配
c) 如果Intent消息中指明了目标组件的名称,这就是一个显示消息,Intent会传递给指明的组件。
d) 如果目标组件名称并没有指定,Android则通过Intent内的其他信息和已注册的IntentFilter的比较来选择合适的目标组件
2. Action [隐式比较]
a) 描述Intent所触发动作的名字字符串。
b) 理论上Action可以为任何字符串,而与Android系统应用有关的Action字符串以静态字符串常量的形式定义在了Intent类中。
3. Data [隐式比较]
a) 描述Intent要操作的的数据的URI和数据类型。
b) 正确设置Intent的数据对于Android寻找系统中匹配Intent请求的组件很重要。
4. Category [隐式比较]
a) 是对被请求组件的额外描述信息。
b) Android也在Intent类中定义了一组静态字符串常量表示Intent不同的类别。
5. Extra
a) 当我们使用Intent连接不同组件时,有时需要在Intent中附加额外的信息,以便将数据传递给目标Activity。
b) Extra用键值对结构保存在Intent对象当中,Intent对象通过调用方法putExtras() 和 getExtras()来存储和获取Extra
c) Extra是以Bundle对象的形式来保存的,Bundle对象提供了一系列put和get方法来设置、提取相应键值信息。
d) 在Intent类中同样为Android系统应用的一些Extra的键值定义了静态字符串常量。
6. Flag

决定Intent目标组件的因素:
在显式Intent消息中,决定目标组件的唯一要素就是组件名称(不用再定义其他Intent内容)
而隐式Intent消息中,由于没有目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。
隐 式Intent消息中目标组件具体选择方法是:android将Intent的请求内容和一个叫做IntentFilter的过滤器比 较,IntentFilter中包含系统中所有可能的待选组件。如果IntentFilter中某一个组件匹配隐式Intent请求内容,那么 Android就选择该组件作为该隐式Intent的目标组件。
IntenFilter
应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。
每个IntentFilter描述该组件所能响应Intent请求的能力 —— 组件希望接收什么类型的请求行为,什么类型的请求数据。
隐式Intent和IntentFilter进行比较时的三要素:Action、Data、Category。
一个隐式Intent请求要能够传递给目标组件,必需通过以上三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。
<intent-filter>
<action android:name=””/>
<category android:name=””/>
<data android:type=”” android:scheme=””
android:authority=”” android:path=””/>
</intent-filter>
1. 动作测试
a) 一条 <intent-filter> 中至少应该包含一个<action>, 否则任何Intent请求都不能和该<intent-filter> 匹配。
b) 如果IntentFilter 中没有包含任何Actino类型,那么无论什么Intent请求都无法和这条IntentFilter匹配。
c) 如果Intent请求中没有设定Action类型,那么只要IntentFilter中包含有Action类型,这个Intent请求将顺利通过IntentFilter的测试。
2. 类别测试
a) 只有当Intent请求中所有的Category与组件中的某一个IntentFilter的category完全匹配,才会让该Intent请求通过测试,IntentFilter中的多余category声明并不会导致匹配失败。
b) 一个没有指定任何类别的IntentFilter仅仅只会匹配没有设置类别的Intent请求。
3. 数据测试
a) <data>元素指定了希望接受的Intent请求的数据URI和数据类型:URI被分成三部分类进行匹配,scheme、authority和 path.
b) 使用 setData设定的Intent请求的URI数据类型和scheme,必须与IntentFilter中指定的一致
若IntentFilter中还指定了authority或path,他们也需要相匹配才会通过测试。

更多相关文章

  1. android开发2:eclipse 开发 Android 应用程序基础
  2. 更改Android AVD模拟器创建路径位置的方法
  3. Android应用程序签名
  4. 使用android快速开发框架afinal 开发android应用程序demo
  5. Android Button的背景图片拉伸变形解决方法
  6. 7个Android应用程序源代码
  7. Android常用组件,太全了

随机推荐

  1. Android RollPagerView实现轮播图
  2. Android之获取wifi信号强度
  3. Android中的状态机(续)
  4. 自定义android Intent Action与继承TextV
  5. Android Notification 通知封装成工具类
  6. Android纯代码写布局
  7. Android Sqlite 简单SQL语句
  8. Android TraceView的使用
  9. Android 购物车的实现
  10. AndroidManifest.xml解析(较详细)