Android应用程序的基本组件介绍

1、Activity和View

Activity是Android应用中负责与用户交互的组件,它只能通过setContentView(View)来显示指定组件。

View组件是所有UI控件、容器空间的基类,View组件就是用户看到的Android应用中实实在在的部分。

但是View组件需要放到容器组件中,或者使用Activity将它显示出来,方法调用activity的setContentView()方法。

两种方法:一种使用View对象作为参数

LinearLayout layout = new LinearLayout(this);//创建一个线性布局管理器,LinearLayout是ViewGroup的子类,后者有时View的子类。

设置该activity显示layout

setContentView(layout);

方法二:使用布局管理资源的ID作为参数

setContentView(R.layout.main);//设置该activity显示main.xml文件定义的view。

实际上activity是window的容器,activity包含一个getWindow()方法,该方法返回该activity所包含的窗口。

2、service

service与activity地位并列的,但它通常位于后台运行,一般不与用户交互,因此service组件没有图形用户界面。service组件通常用于为其他组件提供后台服务或者监控其他组件的运行状态。

3、BroadcastReceiver

表示广播消息接收器。它非常类似于事件编程中的监听器;与普通事件监听器监听的事件源是程序中的对象,而它监听的是事件源是Android应用中的其他组件。

使用BroadcastReceiver组件接收广播消息比较简单,开发者只需要实现自己的BroadcastReceiver子类,并重写onReceive(Context context,Intent intent)方法即可。当其他组件通过sendBroadcast()、sendStickyBroadcast()或者sendOrderedBroadcast()方法发送广播消息时,如该BroadcastReceiver也对该广播消息感兴趣(通过IntentFilter配置),BroadcastReceiver的onReceive(Context context,Intent intent)方法将会被触发。

实现了BroadcastReceiver之后,有两种方式注册这个系统级的“事件监听器”:

1、在java代码中通过Context.registerReceiver()方法注册BroadcastReceiver。

2、在AndroidManifest.xml文件中使用<receiver.../>元素来完成注册。

4、ContentProvider

如果Android应用之间需要实现实时的数据交换。使用标准ContentProvider。当用户实现自己的ContentProvider时,需要实现以下方法:

inset(Uri,ContentValues):向ContentProvider插入数据

delete(Uri,ContentValues):删除contentprovider中指定数据

update(Uri,ContentValues,string,String[]):更新ContentProvider中指定数据

query(Uri,String[],String,String[],String):从ContentProvider查询数据。

一个应用程序使用ContentProvier暴露自己的数据,另一个应用程序使用ContentResolver来访问数据。

5、Intent和IntentFilter

Intent是Android应用内不同组件之间通信的载体。它可以启动应用中另一个activity,也可以启动一个service组件,还可以发送一条广播消息来出发系统中的BroadcastReceiver。也就是说activity、service、BroadcastReceiver三种组件之间的通信都以Intent为载体。

a、需要启动一个activity时,可调用context的startActivity(Intent intent)或startActivityForResult(Intent intent,int requestCode)方法,这两个方法中的Intent参数封装了需要启动的目标Acitivity的信息。。

b、当启动一个service时,可调用Context的startService(Intent intent)方法或bindService(Intent service,ServiceConnection conn,int flags)方法,这两个方法中的Intent参数封装了需要启动的目标Acitivity的信息。。

c、当需要发一个BroadcastReceiver时,可调用Context的sendBroadcast(Intent intent)、sendStickyBroadcast(Intent intent)或者sendOrderedBroadcast(Intent intent,String receivePermission),这两个方法中的Intent参数封装了需要启动的目标Acitivity的信息。

Intent封装了当前组件需要启动或出发的目标组件的信息。

当一个组件通过Intent表示了启动或触发另一个组件的“意图”之后,这个意图分为两类:

显式Intent:显式Intent明确指定需要启动或者触发的组件的类名。

隐式Intent:隐式Intent只是指定需要启动或者触发的组件满足怎样的条件。

对于隐式Intent而言,Android系统需要对该Intent进行解析,解析出它的条件,然后再去系统中查找与之匹配的目标组件。找到则触发。

那么Android系统如何判断被调用组件是否符合隐式Intent呢?靠IntentFilter来实现,被调用组件可通过IntentFilter来声明自己所满足的条件--也就是声明自己到底能处理哪些隐式Intent。