一、选择题(每题 5 分,共 10 题)
-
下列哪个不属于 Android 四大组件?
A. Activity
B. Service
C. Handler
D. BroadcastReceiver
答案:C
解析:四大组件是 Activity、Service、BroadcastReceiver、ContentProvider。Handler 是消息处理机制,不属于组件。
-
在 AndroidManifest.xml 中,声明应用入口 Activity 需要添加的 intent-filter 是?
A.
ACTION_MAIN+CATEGORY_DEFAULTB.
ACTION_MAIN+CATEGORY_LAUNCHERC.
ACTION_LAUNCHER+CATEGORY_HOMED.
ACTION_VIEW+CATEGORY_LAUNCHER答案:B
解析:ACTION_MAIN 声明为应用主入口,CATEGORY_LAUNCHER 使其出现在桌面启动器中,二者组合才能产生桌面图标。
-
关于
dp和px,以下说法正确的是?A. 1dp 在所有设备上永远等于 1px
B. dp 是像素单位,px 是密度无关单位
C. dp 是密度无关像素,在不同密度屏幕上显示大小一致
D. 文字大小应该用 dp 设置
答案:C
解析:dp 根据屏幕密度自动缩放,保证在不同 DPI 屏幕上物理大小一致。文字应用 sp,px 是绝对像素。
-
当 Activity A 启动 Activity B 时,A 和 B 的生命周期调用顺序是?
A. A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop
B. A.onStop → B.onCreate → B.onStart → B.onResume → A.onPause
C. B.onCreate → A.onPause → B.onStart → A.onStop → B.onResume
D. A.onPause → A.onStop → B.onCreate → B.onStart → B.onResume
答案:A
解析:A 先失去焦点(onPause),然后 B 创建并显示,最后 A 完全不可见(onStop)。
-
Toast 的
LENGTH_SHORT大约显示多长时间?A. 1 秒
B. 2 秒
C. 3.5 秒
D. 5 秒
答案:B
解析:LENGTH_SHORT 约 2 秒,LENGTH_LONG 约 3.5 秒,这是系统常量,不能自定义毫秒数。
-
以下哪种方式不能 实现 Button 的点击事件?
A. XML 中配置
android:onClick="methodName"B. 调用
setOnClickListener()C. 调用
setOnItemClickListener()D. Activity 实现
View.OnClickListener接口答案:C
解析:setOnItemClickListener 是 ListView/AdapterView 的列表项点击监听,普通 Button 没有此方法。
-
LinearLayout设置android:orientation="horizontal"时,子控件如何排列?A. 从上到下垂直排列
B. 从左到右水平排列
C. 层叠堆放在左上角
D. 按权重随机排列
答案:B
解析:horizontal=水平方向从左到右,vertical=垂直方向从上到下。
-
RelativeLayout中,将一个控件放在另一个控件下方的属性是?A.
android:layout_aboveB.
android:layout_belowC.
android:layout_toLeftOfD.
android:layout_alignTop答案:B
解析:below=在下方,above=在上方,toLeftOf=在左侧,toRightOf=在右侧。
-
Handler 中
handleMessage()方法运行在哪个线程?A. 调用
sendMessage()的线程B. Handler 创建时关联的 Looper 所在线程
C. 始终在子线程
D. 在新创建的独立线程
答案:B
解析:Handler 构造时绑定一个 Looper,handleMessage 就在该 Looper 所在线程执行。通常用主线程 Looper 使 handleMessage 在主线程更新 UI。
-
关于 GET 和 POST 请求,以下说法错误 的是?
A. GET 参数拼接在 URL 中,POST 参数放在请求体中
B. POST 比 GET 更安全,参数不会暴露在 URL 中
C. GET 请求的数据量没有限制
D. 在 Android 中,网络请求必须放在子线程
答案:C
解析:GET 参数拼在 URL 中,受 URL 长度限制(通常约 2KB),并非无限制。
二、填空题(每题 4 分,共 10 题)
-
Android 应用的包名和四大组件必须在 ____________ 文件中声明。
答案:AndroidManifest.xml
解析:manifest 是应用的入口配置文件,四大组件不在此声明会抛类找不到异常。
-
使用
TableLayout时,每一行通过 ____________ 标签表示。答案:<TableRow>
解析:TableLayout 类似 HTML 的 table,TableRow 相当于 tr,每行内的 View 相当于 td。
-
设置控件 id 的语法是
android:id="________"(请写出完整格式)。答案:@+id/xxx
解析:@+id/ 表示新建一个 id 资源,+ 号表示添加到 R.java 中。引用已有 id 用 @id/(不加 +)。
-
创建 AlertDialog 必须使用 ____________ 模式进行构造。
答案:Builder(建造者模式)
解析:AlertDialog 构造器是 protected 的,不能直接 new,必须通过 Builder 一步步设置属性后 show()。
-
Handler 发送消息到消息队列的方法是 ____________。
答案:sendMessage()
解析:handler.sendMessage(msg) 将 Message 加入 MessageQueue。
-
Android 中用于调试的命令行工具缩写是 ____________。
答案:adb
解析:adb(Android Debug Bridge)用于连接设备、安装 APK、查看日志(adb logcat)、进入 shell 等。
-
Activity 加载布局文件的方法是 ____________。
答案:setContentView()
解析:调用 setContentView(R.layout.xxx) 将 XML 布局解析为 View 树并绑定到 Activity。必须在 onCreate 中且在 findViewById 之前调用。
-
EditText中设置占位提示文字的属性是 ____________。答案:android:hint
解析:hint 显示为灰色文字,用户输入后自动消失,常用于"请输入用户名"等提示。
-
通过 Intent 传递数据的方法是 ____________ 和 ____________(发送和接收)。
答案:putExtra();getStringExtra() 或 getXxxExtra()
解析:发送用 putExtra(key, value),接收根据数据类型用 getStringExtra、getIntExtra 等方法。
-
主线程又被称作 ____________ 线程,因为它负责更新界面。
答案:UI
解析:UI 线程即主线程,只有它能操作界面控件。子线程不能直接更新 UI,必须通过 Handler 等机制。
三、简答题(每题 7 分,共 4 题)
-
简述
implementation和api在 Gradle 依赖配置中的区别。答案:
implementation依赖不对外传递,调用者无法使用被依赖库的 API;api依赖会传递,调用者可以直接使用被依赖库的类。一般用 implementation 可减少编译时间。解析:A implementation B,B api C → A 能直接用 C 的类;B implementation C → A 不能调用 C。
-
写出 Activity 生命周期的七个回调方法名称,并简要说明每个回调的用途。
答案:onCreate(初始化布局、findViewById)→ onStart(即将可见)→ onResume(前台交互,获焦点)→ onPause(失去焦点,保存数据,必须快速完成)→ onStop(完全不可见,释放重量级资源)→ onDestroy(最终销毁,清理所有绑定)。onRestart(从 stop→start)不是必经回调。
解析:口诀"创§始现焦失停毁重启"。必须记住顺序和典型用途,考试常考 A 启动 B 的调用顺序。
-
简述 Handler 机制中 Looper、MessageQueue、Message、Handler 四者的关系。
答案:Looper 是消息循环器,不断从 MessageQueue(消息队列,按时间排序的单链表)中取出 Message(消息载体,含 what/obj);Handler 负责 sendMessage 将消息放入队列,并在目标线程的 handleMessage 中处理消息。主线程自带 Looper,子线程默认没有。
解析:Handler.sendMessage(msg) → MessageQueue 存储 → Looper.loop() 取出 → Handler.handleMessage 处理。Message 推荐用 obtain() 复用。
-
简述使用 HttpURLConnection 发送 POST 请求的完整步骤。
答案:(1) new URL() → (2) openConnection() → (3) setRequestMethod("POST") → (4) setDoOutput(true) → (5) setRequestProperty 设置 Content-Type → (6) getOutputStream() 写请求体 → (7) getInputStream() 读响应 → (8) disconnect()。整个过程在子线程,需声明 INTERNET 权限。
解析:POST 与 GET 关键区别是 setDoOutput(true) 和写请求体。
四、编程题(填空方式)(每题 10 分,共 2 题)
- 以下代码实现从 MainActivity 跳转到 SecondActivity,并传递用户名和密码。
java
// MainActivity.java
public void goToSecond(View view) {
Intent intent = new Intent(MainActivity.this, __________(1)__________);
intent.putExtra(__________(2)__________, "zhangsan");
intent.putExtra("password", "123456");
__________(3)__________;
}
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = __________(4)__________;
String username = intent.__________(5)__________("username");
}
答案:(1) SecondActivity.class (2) "username" (3) startActivity(intent) (4) getIntent() (5) getStringExtra
解析:(1) Intent 构造器第二个参数是目标 Class 对象;(2) putExtra 第一个参数是 key;(3) 启动 Activity 必须调 startActivity;(4) getIntent() 获取启动当前 Activity 的 Intent;(5) 用 key 取出字符串。
- 以下代码实现在子线程下载数据,完成后通过 Handler 更新 UI。
java
private Handler handler = new Handler(__________(1)__________) {
@Override
public void handleMessage(Message msg) {
if (msg.__________(2)__________ == 1) {
String result = (String) msg.__________(3)__________;
textView.setText(result);
}
}
};
private void loadData() {
new Thread(new Runnable() {
@Override
public void run() {
String data = downloadFromServer();
Message msg = Message.__________(4)__________;
msg.what = 1;
msg.obj = data;
handler.__________(5)__________;
}
}).start();
}
答案:(1) Looper.getMainLooper() (2) what (3) obj (4) obtain() (5) sendMessage(msg)
解析:(1) 主线程 Looper,使 handleMessage 在主线程更新 UI;(2) what 消息标识;(3) obj 携带 Object 数据;(4) obtain() 复用 Message;(5) sendMessage 发送到队列。