在安卓中四大组件 (Component)指的是:Activity,Service,BroadcastReceiver,ContentProvider。此博客仅仅对安卓中四大组件从整体上进行简单的分析,了解他们在安卓系统框架中处的位置与作用,各组件详细介绍将单独讲解。
首先,我们来看一下这几个类之间各自的继承关系
从上述可以看出四大组件中的Activity,Service组件都继承自Context,即它们都可看做是一个Context(事实上,安卓中的Context包括三种情况,即Application,Service与Activity),而BroadcastReceiver与ContentProvider相对独立,与其它组件在继承上没太大关联。
(一)下面我们看一下安卓官方文档Context的类的描述
从文档描述我们可以知道,Context是一个抽象类,它用来访问特定的资源或者类,是安卓系统中用来管理与操作application-level operations的类。例如,启动Activity,Service组件、注册广播接收者和启动Content Provider组件,接收Intent等。也正因为如此,所以安卓中常用的一些方法都位于Context类中,分别对应对相关组件的操作,比如startActivity对应启动一个Activity,startService/stopService,bindService/unBindService对应Service组件的操作,registerReceiver/unregisterReceiver,sendBroadcast,sendOrderdBroadcast对应BroadcastReceiver的操作,obtainStyledAttributes对应对View的操作(该函数在仔定义View属性集时会用到),openFileInput,openFileOutput,openOrCreateDatabase对应文件及数据库的操作。
注意
1)Context中存在一个重要的方法abstract Context getApplicationContext(),它返回的是一个Context对象,而Context的子类Activity,Service中存在一个类似的方法final Application getApplication(),它返回的是一个Application对象,在安卓四大组件中只有Activity与Service这两大组件中存在getApplication()方法。
2)Context的子类Activity重写了Context的startActivity()方法,一般情况下我们都是在一个Activity中启动另一个Activity,即形成所谓的Activity任务栈,但是如果在Service中调用startActivity()时,因为Service没重写Context的startActivity()方法,所以本质上它调用的是Context的startActivity()方法,此时则必须添加FLAG_ACTIVITY_NEW_TASK flag即
使用intent.setFlag(FLAG_ACTIVITY_NEW_TASK );语句。
3)在使用四大组件时经常需要指定Context参数,该参数本质上是ContextImpl对象,ContextImpl类继承自Context类,它是安卓系统框架自动管理的。
(二)维系安卓四大组件的Intent
首先看一下官方文档对Intent类的描述
从上述文档中可以看出,Intent作为一个动作的抽象描述被执行,Intent是为了降低安卓系统组件交互耦合度而采取的一种通信机制,也正因为如此,所以启动安卓各组件的方法非常相似。
1)Intent用来启动Service与Activity用法一般都相同,即通过Intent intent=new Intent(Context context,Class<?>class);,startActivity(intent)/startService(intent)来启动对应的组件
2)对BroadcastReceiver的启动与上述不同,因为对于BroadcastReceiver一般事先不用指定具体的组件名(这也正是BroadcastReceiver存在的意义)而是通过
intent.setAction(String action)或Intent intent=new Intent(String action)的方式来指定启动对action“感兴趣”的广播,即
Intent intent=new Intent();
intent.setAction(Constants.ACTION_MSG);
sendBroadcast(intent);或
Intent intent=new Intent(Constants.ACTION_MSG);
sendBroadcast(intent);
3)对于上述三种组件传递数据方式都相同,一般通过intent.putExtra(String name,Serializable value);来传递对象或使用其它相应方法传递基本类型数据,
例如在启动广播时,
Intent intent=new Intent();
intent.setAction(Constants.ACTION_MSG);
intent.putExtra(Constants.MSG, msg);
sendBroadcast(intent);
4)Intent详细介绍请参考博文http://www.cnblogs.com/engine1984/p/4146621.html