《Android 应用开发》期中考试
1、 简述 Android 应用程序结构是哪些? (5 分)
答:(1)一组 View(UI 组件)。这些组件包括列表(List)、文本框(textbox)、按钮(button)
等。通过这些 UI 组件可以构建应用程序的视图部分。
(2)Content Providers。它提供了一种机制,通过这种机制,应用程序可以实现数据的
互访和共享。
(3)Resource Manager。它负责管理非代码的访问。即资源文件的访问管理。
(4)Notification Manager。它能让程序将自己的警示信息显示在状态栏上。例如:当有
短信时,可以在状态栏上显示出新短信的信息。
(5)Activity Manager。它管理着应用的生命周期,并且提供了应用页面退出的机制。在
Android 应用中,每个应用一般由多个页面组成,而每个页面的单位就是 Activity。通俗
的说,Android 的应用是由多个 Activity 的交互构成的。
2、请描述下 Activity 的生命周期以及何时调用相应的生命周期。(5 分)
答:生命周期,Activity 有三个状态:
(1)当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应
用户操作的 Activity。
(2)当它上面有另外一个 Activity,使它失去了焦点但仍然对用户可见时,它处于暂停状
态。在它之上的 Activity 没有完全覆盖屏幕,或者是透明的,被暂停的 Activity 仍然对用
户可见,并且是存活状态。如果系统处于内存不足时会杀死这个 Activity。
(3)当它完全被另一个 Activity 覆盖时则处于停止状态。它仍然保留所有的状态和成员信
息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常
会杀死这个 Activity。
调用相应的生命周期:Activity 从一种状态转变到另一种状态时,会调用以下保护方法来通
知 这 种 变 化 : onCreate(Bundle savedInstanceState), onStart(), onRestart(),
onResume(), onPause(), onStop(), onDestroy().
3、android 的四大组件是(5 分)
答:Activity(Android 的窗体)、Service(服务)、Broadcast Receiver(广播接收器)、
Content Provider(内容提供者)
4、请介绍下 Android 中常用的五种布局。(5 分)
答:(1)框架布局(FrameLayout,或称堆栈布局):所有添加到框架布局中的视图都是以
层叠的方式显示,这种显示方式类似堆栈。
(2)线性布局(LinerLayout):线性布局可分为水平线性布局和垂直线性布局。水平线
性布局所有在这个布局中的视图都沿着水平方向线性排列。垂直线性布局则沿着垂直方向线
性排列。
(3)相对布局(RelativeLayout):相对布局中可以设置某一个视图相对于其他视图的位
置,包括上、下、左、右。
(4)表格布局(TableLayout):表格布局可以将视图按行、按列进行排列。
(5)绝对布局(AbsoluteLayout):可以任意设置视图定位位置。
5、简述如何实现 Activity 的跳转,并写出主要代码。(20 分)
答:先根据控件的 ID 获取该控件,加一个监听器,实现一个接口,将监听器捆绑到控件上,
定义并生成一个 Intent 对象,调用 Intent 的 setClass 方法,实现使用一个 Activity 调用
另外一个 Activity,最后用 startActivity 方法启动跳转。主要源代码如下:
// 创建一个 Activity
public class Activity1 extends Activity {
private Button btn = null;
setContentView(R.layout.main);
//显示相应的布局文件
btn = (Button)findViewById(R.id. btn);
//根据控件 ID 获取控件
btn.setOnClickListener(new MyButtonListener()); //将监听器捆绑到控件上
}
// 加一个监听器,实现一个接口
class MyButtonListener implements OnClickListener{
public void onClick(View v) {
Intent intent = new Intent(); // 生成一个 Intent 对象
//调用 Intent 的 setClass 方法,实现使用一个 Activity 调用另外一个 Activity
intent.setClass(Activity1.this, Activity2.class);
Activity1.this.startActivity(intent);
}
6、做一个较复杂的界面布局,画出来,每个部分用的什么控件,各个控件中你用到的属性
是什么,写出来。(20 分)
答:如有图所示。
(1) 使用框架布局,有两个层。底层背景图使用图片控
件(使用到的属性:宽 layout_weight,高 layoutheight,
图片控件
ImageView
图片控件
ImageView
对齐方式 layout_gravity)。
(2) 在顶层,使用垂直线性布局,将顶层分为三个
区,在第二个区放置一个用于显示图片信息 TextView(使
TextView(文本显示)
到的属性:宽 layout_weight,高 layoutheight,字体大
Button(按钮 1)Button(按钮 2)
小 textSize,文本内容 text)。
(3) 在第三区,放置用于切换图片的两个按钮 Button(使用的属性:宽 layout_weight,
高 layoutheight,按钮内容字体大 textSize, 文本内容 text)。
在第一个区域,再次使用水平线性布局,将该区域分为两块,都使用图片控件 ImageView,
用于显示图片,(ImageView 使用到的属性::宽 layout_weight,高 layoutheight,图片
源 src)。
7、阅读如下代码,根据注释填空。(每空 2 分,共 20 分)
package bigbear.Menu;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.widget.EditText;
import android.widget.Toast;
public class MenuActivity extends Activity {
/** Called when the activity is first created. */
//声明一个文本框控件
①
private
@Override
public void onCreate(Bundle savedInstanceState) {
edittext = null;
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的ID获取控件
edittext = (EditText)
②
(R.id.editText1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
//--------------添加“字体大小”的子菜单---------
③
fontMenu = menu.addSubMenu("字体大小");
//设置菜单图标
fontMenu.setIcon(R.drawable.ic_launcher);
//设置菜单头图标
fontMenu.setHeaderIcon(R.drawable.ic_launcher);
//设置菜单头的标题,并添加菜单项
fontMenu.setHeaderTitle("请选择字体的大小:");
//添加子菜单的菜单项
④
font10 = fontMenu.add("10号字体");
//为子菜单的菜单项绑定监听器
⑤
.setOnMenuItemClickListener(new
OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
edittext.setTextSize(10 * 2);
return false;
}
})
//----------添加普通菜单项---------------------
MenuItem plain = menu.add("普通菜单项");
plain.setIcon(R.drawable.ic_launcher);
//设置单击监听事件
plain.setOnMenuItemClickListener(new
OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
//使用Toast弹出消息
⑥
toast =Toast.makeText(MenuActivity.this,
"单击事件", Toast.LENGTH_SHORT);
toast.
return false;
⑦
;
}
});
//-------------添加文字颜色子菜单------------
SubMenu colorMenu = menu.addSubMenu(1,1,1,"喜欢的颜色");
⑧请解释上一行的参数1,1,1所代表的含义
colorMenu.setIcon(R.drawable.ic_launcher);
colorMenu.setHeaderIcon(R.drawable.ic_launcher);
colorMenu.setHeaderTitle("请选择喜欢的颜色:");
MenuItem redItem = colorMenu.add(1,1,2,"红色");
//redItem.setCheckable(true);
//redItem.setChecked(true);
MenuItem greenItem = colorMenu.add(1,1,3,"绿色");
MenuItem blueItem = colorMenu.add(1,1,4,"蓝色");
//blueItem.setCheckable(true);
blueItem.setChecked(true);
colorMenu.setGroupCheckable(1, true, true);
⑨请解释上一行代码含义
redItem.setOnMenuItemClickListener(new
OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
//设置文本框中字体的颜色为红色
⑩ .setTextColor(Color.RED);
return false;
}
});
blueItem.setOnMenuItemClickListener(new
OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
edittext.setText("您选择了蓝色");
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
答:
① EditText ② findViewById ③ SubMenu ④ MenuItem ⑤ font10
⑥ Toast ⑦ show()
⑧第一个 1:子菜单组号(groupId);第二个 1:Menu Item 识别序号(itemId);第三
个 1:子菜单项序号(order)
⑨setGroupCheckable()方法:添加菜单项目组到菜单,第一个参数为要设置的 groupId,
第二个为菜单项是否可选,最后一个参数是是否为单选
⑩ edittext
8、上下文菜单如何注册?(5 分)
答:上下文菜单必须注册到指定的 View 上才能显示,如:
registerForContextMenu(button);
registerForContextMenu(editText);
registerForContextMenu(textView);
9、如何创建带 3 个按钮的对话框?(15 分,要求贴出主要代码并对最终效果截图)
源代码:
package com.jero.threeButtonDialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
public class threeButtonDialog extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new
AlertDialog.Builder(this).setIcon(R.drawable.question).setTitle(
"是否发送错误报告?").setPositiveButton("发送",
new DialogInterface.OnClickListener()
{
public
void
onClick(DialogInterface
dialog,
int
whichButton)
{
new AlertDialog.Builder(threeButtonDialog.this)
.setMessage("错误报告已经发送,感谢您的使用。
").create().show();
}
}).setNeutralButton("
忽
略
",
new
DialogInterface.OnClickListener()
{
public
void
onClick(DialogInterface
dialog,
int
whichButton)
{
new
AlertDialog.Builder(threeButtonDialog.this).setMessage(" 您 已 经 忽 略
了这个错误。")
.create().show();
}
}).setNegativeButton("
取
消
",
new
DialogInterface.OnClickListener()
{
public
void
onClick(DialogInterface
dialog,
int
whichButton)
{
new
AlertDialog.Builder(threeButtonDialog.this).setMessage(" 您 已 经 取 消
了所有的操作.").
create().show();
}
}).show();
}
}
最终效果截图: