Android应用通常由一个或多个基本组件组成(Activity、Service、BroadcastReceiver、ContentProvider等),其中最常用的组件就是Activity。
Activity
Activity为Android应用提供了可视化用户界面(是应用中负责于用户交互的组件),如果该Android应用需要多个用户界面,那么这个Android应用将会包含多个Activity,多个Activity组成Activity栈,当前活动的Activity位于栈顶。
实际上Activity是Window的容器,Activity包含一个getWindow()方法,该方法返回该Activity所包含的窗口。对于Activity而言,开发者一般不需要关心Window对象。如果应用程序不调用Activity的setContentView()来设置该窗口显示的内容,那么该程序将显示一个空窗口。
View
View组件是所有UI控件、容器控件的基类,View组件就是Android应用中用户实实在在看到的部分。
但View组件需要放到容器组件中,或者使用Activity将它显示出来。如果需要通过某个Activity把指定View显示出来,调用Activity的setContentView()方法即可。
//创建一个线性布局管理器
LinearLayout layout = new LinearLayout(this);
//设置该Activity显示layout
super.setContentView(layout); //接受一个View对象作为参数
//设置Activity显示main.xml文件定义的View
setContentView(R.layout.main); //接受一个布局管理资源的ID作为参数
Service
Service组件通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。
当一个Service组件被运行起来之后,它将拥有自己独立的生命周期,Service组件通常用于为其它组件提供后台服务或监控其它组件的运行状态。
BroadcastReceiver
BroadcastReceiver代表广播消息接收器,从代码实现角度来看,其非常类似于事件编程中的监听器,其监听的事件源是Android应用中的其它组件。
开发者只要实现自己的BroiadcastReceiver子类,并重写onReceive(Context context, Intent intent)方法即可。当其它组件通过SendBroadcast()、sendStickyBroadcast()或sendOrderedBroadcast()方法发送广播消息时,若该BroadReceiver对此消息感兴趣(通过IntentFilter配置),其onReceive(Context context, Intent intent)方法将会被触发。
注册这个系统级的“事件监听器”的方法:
1. 在Java代码中通过Context.registReceiver()方法注册BroadcastReceiver。
2. 在AndroidManifest.xml文件中使用<receiver ... />
元素完成注册。
ContentProvider
由于Android应用各自运行在自已的Dalvik虚拟机实例中,如果应用之间需要实现实时的数据交换,就要遵循Android系统为这种跨应用的数据交换制定的标准:ContentProvider。
用户实现自己的ContentProvider的方法:
1. 实现抽象方法insert(Uri, ContentValues)。向ContentProvider插入数据。
2. 实现抽象方法delete(Uri, ContentValues)。删除ContentProvider中指定的数据。
3. 实现抽象方法update(Uri, ContentValues, String, String[])。更新ContentProvider中指定的数据。
4. 实现抽象方法query(Uri, String[], String, String[], String)。从ContentProvider查询数据。
通常与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,而另 一个应用程序则通过ContentResolver来访问数据。
Intent
Intent是Android应用内不同组件之间通信的载体,其可用于启动应用中另一个Activity、启动一个Service组件、发送一条广播消息来触发系统中的BroadcastReceiver。启动上述其它组件的方法如下:
- 启动Activity时,调用Context的startActivity(Intent intent)方法,其中Intent参数封装了需要启动的目标Activity信息。
- 启动Service时,调用Context的startService(Intent intent)方法或bindService(Intent service, ServiceConnection conn, int flags)方法,其中的Intent参数封装了需要启动的目标Service信息。
- 启动BroadcastReceiver时,调用Context的sendBroadcast(Intent intent)、sendStickyBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent, String receiverPermission),其中Intent参数封装了需要触发的目标BroadcastReceiver的信息。
当一个组件通过Intent表示了启动或触发另一个组件的“意图”之后 ,这个意图可以分为两类:
- 显式Intent,其明确指定需要启动或者触发的组件的名称。
- 隐式Intent,其只指定需要启动或者触发的组件应满足怎样的条件。Android系统会对该Intent进行解析,解析出它的条件,然后于去系统中查找与之匹配的目标组件。如果找到符合条件的组件,就启动或触发它们。被调用组件可通过IntentFilter来声明自己所满足的条件,也即声明自己到底能处理哪些隐式Intent。
摘自《疯狂Android讲义》