第三章 多个用户界面的程序设计
本章课程重点和难点
- Intent组件的作用及使用方法
- 界面之间的跳转以及传值常用的方式
- 菜单的使用及实现过程
- 常见对话框的使用及实现过程
3.1 页面切换与传递参数值
Activity页面切换
Activity跳转与传递参数值主要通过Intent类协助实现。在一个Activity页面中启动另一个 Activity页面的运行,是最简单的Activity页面切换方式。其步骤如下:
1、创建一个Intent对象,其构造方法为:
Intent intent = new Intent(当前Activity.this, 另一Activity.class);
2 、然后调用Activity的startActivity(intent)方法,切换到另一个Activity页面。
应用Intent在Activity页面之间传递数据
- Bundle类是一个用于将字符串与某组件对象建立映射关系的组件。Bundle组件与Intent配 合使用,可在不同的Activity之间传递数据。Bundle类的常用方法如下:
- putString(String key, String value): 把字符串用“键-值”形式存放到Bundle对象中;
- remove(String key):移除指定key的值;
- getString(String key):获取指定key的字符。
菜单Menu
- 一个菜单(Menu)由多个菜单选项组成,选择一个菜单项就可以引发一个动作事件。
- 在Android系统中,菜单可以分为三类:选项菜单(Option Menu),上下文菜单(Context Menu)以及子菜单(Sub Menu)
选项菜单
选项菜单需要通过按下设备的Menu键来显示。当按下设备上的Menu键后,在屏幕底部(顶部)弹出一个菜单,这个菜单称作选项菜单(OptionsMenu)
方 法 | 说 明 |
onCreateOptionMenu(Menu menu) | 用于初始化菜单,menu为Menu对象实例。 |
onPrepareOptionsMenu(Menu menu) | 改变菜单状态,在菜单显示前调用。 |
onOptionsMenuClosed(Menu menu) | 菜单被关闭时调用。 |
onOptionsItemSelected(MenuItem item) | 菜单项被点击时调用,即菜单项的监听方法。 |
设计选项菜单需要用到Menu、MenuItem接口。一个Menu对象代表一个菜单,Menu对象中可以添加菜单项MenuItem对象,也可以添加子菜单SubMenu。
菜单Menu使用add(int groupId, int itemId, int order, CharSequence title) 方法添加一个菜单项。
add()方法中的四个参数,依次是:
(1)组别;
(2)Id,这个很重要,Android根据这个Id来确定不同的菜单;
(3)顺序,哪个菜单项在前面由这个参数的大小决定;
(4)文本,菜单项的显示文本。
创建选项菜单的步骤
- 重写Activity的onCreateOptionMenu(Menu menu)方法,当菜单第一次被打开时调用;
- 调用Menu的add( )方法添加菜单项(MenuItem);
- 重写Activity的onOptionsItemSelected(MenuItem item)方法,当菜单项(MenuItem)被选择时来响应事件。
上下文菜单
Android系统 的上下文菜单类似于 PC 上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。
创建一个上下文菜单的步骤
- 重写Activity 的 onCreateContextMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。
- 重写 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。
- 调用Activity 的 registerForContextMenu() 方法,为视图注册上下文菜单。
对话框
对话框是一个有边框、有标题栏的独立存在的容器,在应用程序中经常使用对话框组件来进行人机交互。Android系统提供了四种常用对话框:
- AlertDialog:消息对话框;
- ProgressDialog:进度条对话框;
- DatePickerDialog:日期选择对话框;
- TimePickerDialog:时间选择对话框。
设计AlertDialog对话框的步骤
1、用AlertDialog.Builder类创建对话框Builder对象
Builder dialog=new AlertDialog.Builder(Context);
2、设置对话框的标题、图标、提示信息内容、按钮等
dialog.setTitle("普通对话框");
dialog.setIcon(R.drawable.icon1);
dialog.setMessage("一个简单的提示对话框");
dialog.setPositiveButton(“确定”, new okClick());
3、创建并显示AlertDialog对话框对象
dialog.create();
dialog.show();
如果在对话框内部设置了按钮,还需要对其设置事件监听OnClickListener。
第5章 后台服务与系统服务调用
本章重点和难点
- 后台服务的概念、生命周期以及调用过程
- 信息广播的原理
- 信息广播的实现
- 系统广播的调用
后台服务Service
Android系统的Service是一种类似于Activity的组件,但Service没有用户操作界面,也不能自己启动,其主要作用是提供后台服务调用。Service不像Activity那样,当用户关闭应用界面就停止运行,Service会一直在后台运行,除非另有明确命令其停止。
通常使用Service为应用程序提供一些只需在后台运行的服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。
Service的生命周期中只有三个阶段:
onCreate, onStartCommand, onDestroy
主要方法
方 法 | 说 明 |
onCreate() | 创建后台服务。 |
onStartCommand (Intent intent, int flags, int startId) | 启动一个后台服务。 |
onDestroy() | 销毁后台服务,并删除所有调用。 |
sendBroadcast(Intent intent) | 继承父类Context的sendBroadcast()方法,实现发送广播机制的消息。 |
onBind(Intent intent) | 与服务通信的信道进行绑定,服务程序必须实现该方法。 |
onUnbind(Intent intent) | 撤销与服务信道的绑定。 |
Service启动和停止的方法
通常Service要在一个Activity中启动,调用Activity的startService(Intent)方法启动Service。
若要停止正在运行的Service,则调用Activity的stopService(Intent)方法关闭Service。
方法startService()和stopService()均继承于Activity及Service共同的父类android.content.Context。
Service启动和停止的要求
一个服务只能创建一次,销毁一次,但可以开始多次,即onCreate()和onDestroy()方法只会被调用一次,而onStartCommand()方法可以被调用多次。后台服务的具体操作一般应该放在onStartCommand()方法里面。
如果Service已经启动,当再次启动Service时则不调用onCreate()而直接调用onStartCommand()。
设计一个后台服务的应用程序步骤
(1)创建Service的子类:
- 编写onCreate()方法,创建后台服务;
- 编写onStartCommand()方法,启动后台服务;
- 编写onDestroy()方法,终止后台服务,并删除所有调用。
(2)创建启动和控制Service的Activity:
- 创建Intent对象,建立Activity与Service的关联;
- 调用Activity的startService(Intent)方法启动Service后台服务;
- 调用Activity的stopService(Intent)方法关闭Service后台服务。
(3)修改配置文件AndroidManifest.xml:
- 在配置文件AndroidManifest.xml的标签中添加如下代码:
信息广播机制Broadcast
- Broadcast是Android系统应用程序之间传递信息的一种机制。当系统之间需要传递某些信息时,不是通过诸如单击按钮之类组件来触发事件,而是由系统自身通过系统调用来引发事件。这种系统调用是由BroadcastReceiver类的实现的,把这种系统调用称为广播。
- BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播信息。
发出一个广播消息并接收的应用程序步骤
(1)创建Intent对象,设置Intent对象的action属性。这个action属性是接收广播数据的标识。 注册了相同action属性的广播接收器才能收到发送的广播数据。
Intent intent = new Intent();
intent.setAction("abc");
(2)编写需要广播的信息内容,将需要播发的信息封装到Intent中,通过Activity或Service继 承其父类Context的sendBroadcast()方法将Intent广播出去。
intent.putExtra("hello", "这是广播信息!"); //以键值对形式封装关闭消息内容
sendBroadcast(intent);
(3)编写一个继承BroadcastReceiver的子类作为广播接收器,该对象是接收广播信息并对信 息进行处理的组件。在子类中要重写接收广播信息的onReceive()方法。
class TestReceiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
/* 接收广播信息并对信息作出响应的代码 */
}
}
(4)在配置文件AndroidManifest.xml中注册广播接收类。
(5)销毁广播接收器。
Android系统在执行onReceive()方法时,会启动一个程序计时器,在一定时间内,广播接收器的实例会被销毁。因此,广播机制不适合传递大数据量的信息。
广播接收器的动态注册
- 为了识别Intent对象的action,有时在IntentFilter对象中设置Intent对象的action,而注册广播接收器的工作由registerReceiver()方法完成。
- registerReceiver(mBroadcast, filter)方法有两个参数,其中参数mBroadcast是广播接收器BroadcastReceiver对象,filter是IntentFilter对象。
- Android 8.0之后推荐使用
系统服务
系统通知服务Notification
Notification是Android系统的一种通知服务,当手机来电、来短信、闹钟铃声时,在状态栏显示通知的图标和文字,提示用户处理。当拖动状态栏时,可以查看这些信息。
Notification提供了声音、振动等属性。
- 系统通知服务Notification由系统通知管理对象NotificationManager进行管理及发布通知。由getSystemService(NOTIFICATION_SERVICE)创建NotificationManager对象,
NotificationManager n_Manager =
(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
- NotificationManager对象通过notify(int id, Notification notification) 方法把通知发送到状态栏。通过cancelAll() 方法取消以前显示的所有通知。
系统定时服务AlarmManager
AlarmManager服务主要有2种应用:
在指定时长后执行某项操作;
周期性的执行某项操作;
android 系统通过intent的action属性可以调用系统功能