Android应用程序由组件构成,组件是可被调用的基本功能模块,Android系统可利用组件解决代码复用问题,降低应用程序的开发难度和规模。
新购买的Android手机上都已经预装了很多常用的软件,如短信、通讯录、电话、时钟、照相机等,这些功能就是一个个独立的Android组件,并且Android系统已经将上述组件提供给程序开发人员,开发人员只需要通过Intent启动即可(后面章节中有关于Intent的详细介绍)。程序开发人员开发程序时,可能经常需要这些功能。例如,开发一款订餐软件,实现用户选择好菜品时可以打电话给店家订餐的功能。此时,程序开发人员可以选择调用系统已经提供的拨打电话功能的组件,也可以选择自己开发组件实现相应的功能。毫无疑问,当然会选择使用第一种方案。
Android程序拥有4大基本组件,分别是Activity,BroadcastReceiver(广播接收器),Service(服务)和Content Provider(内容提供者)。并不是每个程序都必须包含这些组件,但一般都由上面的一个或多个组件构成,并且涉及的组件信息必须在AndroidManifest.xml文件中声明。
Activity,一般称之为“活动”。Activity是应用程序的显示层,一个Activity创建一个窗口。
新创建应用程序时,默认在/res/layout目录下创建了布局文件 activity_main.xml。并且同时在java源代码目录下,默认创建了MainActivity类,工程结构如图2-18所示。
图2-18 工程结构
MainActivity类继承于Activity类,MainActivity类的代码如下:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
通过代码可以发现,正是在Activity的方法中调用了 setContentView(View)方法,将可视界面信息放到该窗口上进行呈现。
除了呈现给用户一个可视的用户界面,Activity同时也要为用户提供和应用程序交互的功能,使程序响应用户的操作。
下面的示例程序展示了Activity和用户的交互。
【例2-4】 在布局文件activity_main.xml 中添加3个控件:一个控件是编辑框EditText,用户可以输入信息;一个控件是文本框 TextView,用于显示信息;一个控件是 Button,用户单击Button 时,可以将编辑框输入的信息显示在TextView 中。实现步骤如下:
(1)在activity_main.xml中添加控件:以拖拽的方式将控件分别拖拽到界面中,新的布局结构如图2-19所示。
(2)在MainActivity中添加代码。
首先,声明与控件相关的属性变量:目的是在代码中通过这些变量实现对界面控件的操控。Android系统中已经定义了许多控件类,如Button,TextView,EditText等,因此声明控件变量时,变量的类型必须与控件类一致。
图2-19 布局结构
然后,在MainActivity的 onCreate()方法中,初始化控件变量,绑定变量和控件:调用findViewById(id)方法,通过控件的ID编号,引用界面上的控件。
最后,添加Button的OnClickListener监听器,实现OnClickListener接口的onClick()方法:用户单击Button时,会触发该监听事件,从而调用该监听器的onClick()方法。在onClick()方法中,调用EditText的getText()方法,获取用户输入信息,调用TextView的setText()显示用户信息,即可实现用户与应用程序的交互。
Activity的完整代码如下:
public class MainActivity extends Activity {
Button button;
TextView textView;
EditText editText;//首先,声明属相变量
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//加载布局
button=(Button)findViewById(R.id.button);
textView=(TextView)findViewById(R.id.textView);
editText=(EditText)findViewById(R.id.editText);//绑定控件
button.setOnClickListener(new View.OnClickListener(){//设置监听器
@Override
public void onClick(View v){
String text=editText.getText().toString();//获取用户输入信息
textView.setText(text);//将输入信息
}
});
}
}
(3)运行项目,查看结果,如图2-20所示。
图2-20 运行效果图
BroadcastReceiver是Android系统中用于接收并响应广播消息的组件。大部分的广播消息由系统产生,比如时区改变、电池电量低、语言选项改变等。此外,应用程序同样也可以产生并发送广播消息,通知本应用的其他组件某个事件已经发生或某些数据已经运算完毕等,从而实现组件间的通信。
BroadcastReceiver的工作原理类似于读者所熟识的电台广播。电台是广播的源头,一个区域里可以同时存在多个电台,每个电台的信号频段不同。某位听众只需要将收音机的接收频段设置与某电台信号频段相同,则可接收该电台的信号。Android系统中,每个广播消息都携带特定的动作信息,只要在BroadcastReceiver中也注册相同的动作信息,该BroadcastReceiver只可以接收到携带相同动作的广播消息。
BroadcastReceiver不包含任何用户界面,但可以通过启动Activity或者Notification通知用户接收到重要消息。Notification能够通过多种方法提示用户,包括闪动背景灯、振动设备、发出声音,或者在状态栏上放置一个持久的图标等。
由于手机屏幕和硬件资源的限制,通常只允许一个应用程序处于活动状态,呈现用户界面,与用户交互信息,其他的应用则全部处于非活动状态。但是在很多实际应用中,即使不显示用户界面,也需要程序的长期运行,比如MP3播放器。用户在MP3用户界面中操作,选择MP3播放后,通常习惯退出该界面,继续使用手机其他的应用,比如听音乐的同时上网、聊微信等。为了满足上述用户需求,Android系统提供了Service组件,必须在Service组件中实现音乐播放功能。
Service是Android系统的服务组件,适用于开发没有用户界面,但是需要长时间在后台运行的功能。这些功能通常包括音乐的播放、网络数据的获得、耗时的运算等。
Service一般由Activity组件启动,但是却不依赖于Activity。Service拥有自己的生命周期,及时启动它的Activity销毁,Service依然能够继续运行,直到自己的生命周期结束。
ContentProvider组件是Android系统提供的一种跨应用的数据共享机制。应用程序可以通过ContentProvider访问其他应用程序的私有数据。这些私有数据可以存储在文件中、数据库中。提供这些数据的应用程序,需要实现ContentProvider提供的一组标准方法。使用这些数据的应用程序,需要通过ContentResolver对象来调用标准的方法。
Android系统提供了一些内置的ContentProvider,能为用户程序提供一些重要的数据信息,比如短信信息、联系人信息、通话记录信息等。程序设计人员能够利用以上ContentProvider,方便实现自定义的应用程序功能。程序设计人员也可以根据需要自定义ContentProvider。
学习本章内容之后,读者可以尝试对项目进行修改,实现以下基本内容:
(1)显示个人信息,包括:照片、专业、姓名、学号等基本信息。
(2)尽量美化界面。
参考示例效果如图2-21所示。
图2-21 布局结构