参考书目:《Android移动开发基础案例教程》
出版社:中国工信出版集团丨人民邮电出版社
编著:黑马程序员
---------------
很认真写的期末考试总结,供大家参考!
· 移动通信1G、2G、3G、4G的概念、优缺点
答:1G是模拟信号,支持语音通话,安全性差,容易被窃听,代表产品:大哥大;2G采用数字信号传输,信号强,支持收发短信,支持小的Java程序,支持数据业务,GPRS工作在2.5GHz,EDGE工作在2.75GHz;3G主要技术有TDSCDMA(中国移动)、WCDMA(中国联通)和CDMA2000(中国电信),HSDPA工作在3.5GHz,提供较快的数据业务;4G是指第四代移动通信技术,主要技术有TD-LTE(中国移动、中国联通、中国电信)和FDD-LTE(中国联通、中国电信),提供更快的数据业务,通过VoLTE技术,支持语音通话在4G频段上进行,提供高清视频、语音通话。
· Android体系结构由几层构成?分别是哪几层?简单介绍每一层的概念、应用
答:四层,分别是应用程序层(Applications)、应用程序框架层(Application Framework)、核心类库层(Libraries)以及Linux内核层(Linux Kernel)。应用程序层是应用程序的集合,各种安装在手机上的App都属于这一层;应用程序框架层主要提供了/构建应用程序时/用到的各种API接口,Android自带的一些核心应用就是使用这些API完成的,例如视图(View)、活动管理器(Activity Manager)、通知管理器(Notification Manager)等;核心类库层包含了系统库/及Android运行时库,系统库主要是通过C/C++库来为Android系统提供主要的特性支持,如OpenGL/ES库提供了3D绘图的支持,Android运行时库提供了Dalvik虚拟机(安卓5.0开始彻底更换为ART);Linux内核层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动等。
· Drawable、Layout、AndroidManifest.xml分别存放什么内容?
答:src目录是源代码目录,存放的是.java文件;gen目录存放ADT自动生成的java文件;bin目录保存了编译过程中产生的文件,以及最终的apk文件;res是资源目录,其中,drawable目录用来保存同一个程序中针对不同屏幕尺寸需要显示的不同大小的图像文件,layout目录用来保存与用户界面相关的布局文件,values目录保存颜色、风格、主题和字符串等资源;project.properties文件记录了Android工程的相关设置;AndroidManifest.xml是XML格式的Android程序声明文件,包含了Android系统运行Android程序前所必须掌握的重要信息,这些信息包括应用程序名称、icon、包名称、模块组成、授权和SDK最低版本等,而且每个Android程序必须在根目录下包含一个AndroidManifest.xml文件。
· Android的常用布局有几种?分别简单介绍它们的特点
答:分别有LinearLayout(线性布局)、RelativeLayout(相对布局)、FrameLayout(帧/框架布局)、TableLayout(表格布局)、GridLayout(网格布局)和AbsoluteLayout(绝对布局)六种。线性布局(LinearLayout)主要以水平和垂直方式来显示界面中的控件;相对布局(RelativeLayout)是通过相对定位的方式指定控件位置,后放置的控件依赖于先放置的控件,是Android默认的布局;帧布局(FrameLayout)是Android中最简单的布局,该布局为每个加入其中的控件创建一个空白区域,所有控件都默认显示在屏幕左上角,并按照先后放入的次序重叠排放,先放入的控件显示在最底层,后放入的控件显示在最顶层;表格布局(TableLayout)是以表格形式排列控件的,通过行和列将界面划分为多个单元格,每个单元格都可以添加控件;网格布局(GridLayout)是Android 4.0新支持的布局方式,将用户界面划分为网格,界面元素可随意摆放在这些网格中;绝对布局(AbsoluteLayout)是通过指定x、y坐标来控制每一个控件位置的。
· TextView和Button的常用属性有哪些?
| 控件属性 | 功能描述 |
TextView | android:text | 设置显示文本 |
android:textColor | 设置文本的颜色 | |
android:textSize | 设置文字大小,推荐单位为sp,如android:textSize = “15sp” | |
android:textStyle | 设置文字样式,如bold(粗体),italic(斜体),bolditalic(粗斜体) | |
android:height | 设置文本区域的高度,推荐单位为dp | |
android:width | 设置文本区域的宽度,推荐单位为dp | |
android:maxLength | 设置文本长度,超出不显示,如android:maxLength = “10” | |
android:password | 设置文本以密码形式“.”显示 | |
android:gravity | 设置文本位置,如设置成”center”,文本将居中显示 | |
android:phoneNumber | 设置以电话号码的方式输入 | |
android:layout_height | 设置TextView控件的高度 | |
android:layout_width | 设置TextView控件的宽度 | |
| 控件属性 | 功能描述 |
Button | android:text | 设置显示文本 |
android:layout_height | 设置Button控件的高度 | |
android:layout_width | 设置Button控件的宽度 | |
android:layout_weight | 设置Button控件的权重 | |
android:onClick | 点击此控件时调用的方法 | |
android:drawable | 在Button组件上放置图片 |
· Android的四大组件是什么?它们的作用分别是什么?
答:Activity(界面)为用户提供可视化界面及操作;Service(服务)是一个长期运行在后台的用户组件,适用于开发没有用户界面且长时间在后台运行的应用功能;Content Provider(数据交换/内容提供者)是在不同程序之间实现数据共享;Broadcast Receiver(广播/广播接收者)是监听系统中的广播消息,以实现在不同组件之间的通信。
· Activity的生命周期有几种状态?有几种方法?什么时候调用这些方法?作用是什么?
答:Activity的生命周期分为5种状态,分别是启动状态、运行状态、暂停状态、停止状态和销毁状态。启动状态很短暂,一般当Activity启动之后便会进入运行状态;运行状态时Activity处于屏幕最前端,它是可见、有焦点的,可以与用户进行交互;暂停状态是当Activity在界面上被部分遮挡,且不能与用户进行交互,如锁屏;停止状态是当Activity在界面上被完全遮挡,完全不能被用户看到,当系统内存不足时,很容易被销毁;销毁状态时Activity将被kill,清理出内存。
Activity的生命周期中主要涉及7种方法(事件回调函数),分别是onCreate()、onStart()、onResume、onPause()、onStop()、onDestroy()和onRestart()方法/函数。onCreate()方法是在Activity创建时调用,通常做一些初始化设置;onStart()方法在Activity即将可见时调用;onResume()方法在Activity可以接收用户输入时调用,此时的Activity位于Activity栈的栈顶;onPause()方法在进入暂停状态时被调用,主要用来保存持久数据、关闭动画、释放CPU资源等;onStop()方法在Activity不对用户可见时调用,Activity进入停止状态;onDestroy()方法在Activity销毁时调用;onRestart()方法在Activity从停止状态进入活动状态前调用。
· Activity之间的跳转需要用到( )组件,根据开启目标组件的方式不同,Intent被分为哪两种类型?简单介绍这两种类型
答:Activity之间的跳转需要用到Intent组件,Intent是一种轻量级的消息传递机制,可以在同一个应用程序内部的不同组件之间传递信息,根据开启目标组件的方式不同,Intent被分为显式启动(意图)和隐式启动(意图)两种类型,显式启动可以通过名称开启指定的目标组件;隐式启动不需要指明需要启动哪一个Activity,而是通过指定action和category等属性信息,由Android系统来决定。
· 对于Android平台提供的5种数据存储方式,简单介绍它们
文件存储 | 分为内部存储和外部存储,直接使用Android文件系统存储数据,可以存储体积较大的数据; | |
SharePreferences | 它是Android提供的用来存储一些简单的配置信息的一种机制,采用了.xml格式将数据存储到设备中,可以存储应用程序的各种配置信息,如用户名、密码等; | |
ContentProvider | 主要用于应用程序之间的数据交换,它可以将自己的数据共享给其他应用程序使用; | |
SQLite数据库 | Android自带的一个轻量级数据库,支持基本SQL语法,利用很少的内存就有很好的性能,一般使用它作为复杂数据的存储引擎,可以存储用户信息等; | |
网络存储 | 将数据存储到服务器上,通过网络提供的存储空间来存储、获取数据信息。 |
· 【程序改错题、程序填空题】
package com.example.saveqq;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
public class SPSaveQQ{
// 保存QQ账号和登录密码到data.xml文件中
public static boolean saveUserInfo(Context context, String number, String password) {
SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putString("userName", number);
edit.putString("pwd", password);
edit.commit();
return true;
}
//从data.xml文件中获取存储的QQ账号和密码
public static Map<String, String> getUserInfo(Context context) {
SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);
String number = sp.getString("userName", null);
String password = sp.getString("pwd", null);
Map<String, String> userMap = new HashMap<String, String>();
userMap.put("number", number);
userMap.put("password", password);
return userMap;
}
}
· 服务的启动方式有几种?分别是哪几种?
答:两种。分别是startService方式启动和bindService方式启动,通过startService()方法启动服务,服务会长期在后台运行,并且服务的状态与开启者的状态没有关系,即使启动服务的组件已经被销毁,服务也会依旧运行;当一个组件通过bindService()启动服务时,服务会与组件绑定,一个被绑定的服务提供一个客户端与服务器接口,允许组件与服务交互、发送请求、得到结果,多个组件可以绑定一个服务,当调用onUnbind()方法时,这个服务就会被销毁。
· 【程序改错题、程序填空题】
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:orientation="vertical">
<EditText
android:id="@+id/et_inputpath"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="data/data/com.example.musicplayer/a.mp3" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="3dp"
android:drawableTop="@drawable/play"
android:gravity="center"
android:text="播放" />
<TextView
android:id="@+id/tv_pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="3dp"
android:drawableTop="@drawable/pause"
android:gravity="center"
android:text="暂停" />
</LinearLayout>
</LinearLayout>
· 【程序改错题、程序填空题】
package com.example.readsms;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tvSms;
private TextView tvDes;
private String text = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvSms = (TextView) findViewById(R.id.tv_sms);
tvDes = (TextView) findViewById(R.id.tv_des);
}
public void readSMS(View view) {
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{ "_id", "address",
"type", "body","date"}, null, null, null);
List<SmsInfo> smsInfos = new ArrayList<SmsInfo>();
if(cursor != null && cursor.getCount() >0 ) {
tvDes.setVisibility(View.VISIBLE);
while(cursor.moveToNext()) {
int _id = cursor.getInt(0);
String address = cursor.getString(1);
int type = cursor.getInt(2);
String body = cursor.getString(1);
long date = cursor.getLong(4);
SmsInfo smsInfo = new SmsInfo(_id, address, type, body, date);
smsInfos.add(smsInfo);
}
cursor.close();
}
for (int i = 0;i < smsInfos.size(); i++) {
text += "手机号码:" + smsInfos.get(i).getAddress() + "\n";
text += "短信内容:" + smsInfos.get(i).getBody() + "\n\n";
tvSms.setText(text);
}
}
}
· 【程序改错题、程序填空题】
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv_flower"
android:layout_width="150dp"
android:layout_height="267dp"
android:layout_centerInParent="true"
android:background="@layout/frame"
android:layout_marginBottom="20dp" />
<Button
android:id="@+id/btn_play"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_centerInParent="true"
android:background="@android:drawable/ic_media_play"/>
</RelativeLayout>
· 【程序改错题、程序填空题】
package com.example.frame;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements View.OnClickListener{
private ImageView iv_flower;
private Button btn_start;
private AnimationDrawable animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_flower = (ImageView) findViewById(R.id.iv_flower);
btn_start = (Button) findViewById(R.id.btn_play);
btn_start.setOnClickListener(this);
//拿到AnimationDrawable对象
animation = (AnimationDrawable)iv_flower.getBackground();
}
public void onClick(View v) {
//播放动画
if(!animation.isRunning()){
animation.start();
btn_start.setBackgroundResource(android.R.drawable.ic_media_pause);
}else{
animation.stop();
btn_start.setBackgroundResource(android.R.drawable.ic_media_play);
}
}
}
· 【程序改错题、程序填空题】
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<EditText
android:id="@+id/et_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入视频文件的路径"
android:layout_toLeftOf="@+id/bt_play" />
<ImageView
android:id="@+id/bt_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@android:drawable/ic_media_play" />
</RelativeLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/play" >
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
· 【程序改错题、程序填空题】
package com.example.videoview;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.VideoView;
public class MainActivity extends Activity implements View.OnClickListener {
private EditText et_path;
private ImageView bt_play;
private VideoView videoView;
private MediaController controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_path = (EditText) findViewById(R.id.et_path);
bt_play = (ImageView) findViewById(R.id.bt_play);
videoView = (VideoView) findViewById(R.id.video_view);
controller = new MediaController(this);
videoView.setMediaController(controller);
bt_play.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_play:
play();
break;
}
}
private void play() {
if (videoView != null && videoView.isPlaying()) {
bt_play.setImageResource(android.R.drawable.ic_media_play);
videoView.stopPlayback();
return;
}
videoView.setVideoPath(et_path.getText().toString());
videoView.start();
bt_play.setImageResource(android.R.drawable.ic_media_pause);
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
bt_play.setImageResource(android.R.drawable.ic_media_play);
}
});
}
}
END.