安卓考试复习
考试题型选择15*2填空15*2编程15*2问答10*1考试重点安卓4层体系架构应用程序层:应用程序集合,所有的应用程序属于这一层应用程序框架:提供了构建程序的各种API核心类库:提供了系统库和Android运行时,包含Dalvik虚拟机Linux内核:提供驱动,显示驱动、音频驱动等五大布局LinearLayout,线性布局,用水平和垂直方式来显示控件,使用orientation(horizont
考试题型
- 选择15*2
- 填空15*1
- 编程10*2
- 问答5*4
- 送分15*1
考试重点
安卓4层体系架构
- 应用程序层:应用程序集合,所有的应用程序属于这一层
- 应用程序框架:提供了构建程序的各种API
- 核心类库:提供了系统库和Android运行时,包含Dalvik虚拟机
- Linux内核:提供驱动,显示驱动、音频驱动等
五大布局
- LinearLayout,线性布局,用水平和垂直方式来显示控件,使用orientation(horizontal, vertical),当控件水平排列时,控件layout_width只能设置为wrap_content,否则其他控件将会被挤出屏幕
- RelativeLayout,相对布局,通过与其他控件或者父组件为参照物,对控件进行摆放
- TableLayout,以表格形式排列控件,通过行列将页面分为单元格,需要配合TableRow使用;strechColumns拉伸列,shrinkColumns收缩列,collapseColumns收起列
- AbsoluteLayout,绝对布局是制定控件的xy属性来对控件进行摆放的一种布局,但是由于在实际编程过程中使用xy布局十分繁琐,在编程中一般不会采用这种布局方式
- FrameLayout,最简单的布局,每个控件有一帧,按照先后顺序重叠摆放,可以理解为图层,消息小红点可以用此种布局实现
控件
-
TextView
- TextView文本显示
- EditText可编辑文本显示
-
Button
- Button普通按钮
- RadioButton单选按钮,和RadioGroup一起使用
-
ImageView图像显示,加载各种图像,并可以对图像进行各种处理功能,图片资源一般存放在res/drawable
-
Dialog
-
Dialog普通对话框
AlertDialog dialog; dialog = new AlertDialog.Builder(this).setTitle("title").setMessage("helloworld").create(); dialog.show();
-
单选对话框,通过.setSingleChoiceItems()实现,参数有三个,第一个为数组,设置选择项列表,第二个设置默认选中项,第三个为设置监听让对话框可以被点击
-
多选对对话框,通过.setMultiChoiceItems()实现,参数也有三个,只有第二个和上面不同,为boolean数组,用来判断哪个选项被勾选
-
进度条对话框,通过ProgressDialog实现
-
消息对话框,通过Toast.makeText()实现,三个参数,第一个为上下文,第二个为文本内容,第三个为显示时长
-
自定义对话框
-
-
ListView
- 列表展示数据,注册时需要指定宽高id
-
Adapter
- BaseAdapter
- getCount
- getItem
- getItemId
- getView
- SimpleAdapter
- ArrayAdapter
- BaseAdapter
四大组件
Activity
四种启动模式
- standard:标准模式,每启动一个新的Activity都会进入任务栈,处于栈顶位置
- singleTop:当启动的Activity已经位于栈顶位置时,就会复用,不会创建新的Activity,非栈顶同样也会创建新的Activity
- singleTask:每个启动Activity时,检查任务栈中是否已经有该Activity实例,发现则复用实例,并且将当前Activity之上的所有Activity出栈
- singleInstance:无论从哪个任务栈启动该Activity都只会创建一个Activity,并且用一个全新的任务栈装载该实例
生命周期
- onCreate():创建时调用
- onStart():即将可见时调用
- onResume():获取焦点时调用
- onPause():暂停、被其他Activity覆盖或锁屏时调用,失去焦点
- onStop():对用户完全不可见时调用
- onDestory():Activity销毁时调用
Intent
作用:指定Activity要执行的动作,在不同组件间交换数据
//开启一个新的Activity,显式意图
Intent intent = new Intent(this, Activity2.class);
startActivity(intent);
//开启一个新的Activity,隐式意图
Intent intent = new Intent();
intent.setAction("cn.itcast.START_ACTIVITY");
startActivity(intent);
//还需要在activity2的清单中添加intent-filter
<intent-filter>
<action android:name="cn.itcast.START_ACTIVITY"/>
</intent-filter>
Activity之间的数据传递
/*当前文件为activity1.java*/
Intent intent = new Intent(this, activity2.class);
//在intent中添加extra_data值为hello_world
intent.putExtra("extra_data", "hello world");
startActivity(intent);
/*当前文件为activity2.java*/
Intent intent = getIntent();
//获取extra_data内容
String extra_data = intent.getStringExtra("extra_data");
Activity数据回传
将数据从当前Activity返回给上一个Activity,调用startActivityForResult()方法
/*当前文件为activity1.java*/
//1. 新建Intent,用startActivityForResult方式启动Activity2
Intent intent = new Intent(this, activity2.class);
startActivityForResult(intent,1);
/*当前文件为activity2.java*/
//2. 在Activity2中新建Intent,在Intent中添加需要回传的数据,设置Result,当Activity销毁时会调用Activity1回调方法
Intent intent = new Intent();
intent.putExtra("extra_data", "hello world");
setResult(1, intent);
/*当前文件为activity1.java*/
//重写onActivityResult方法,得到Intent中的回传数据
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if( requestCode == 1){
if( resultCode == 1){
String string = data.getStringExtra("extra_data");
}
}
}
BroadcastReceiver
- 有序广播:可以被拦截,通过priority设置优先级,数值越大优先级越高
- 无序广播:无法拦截,效率高
/*该文件为mainActivity.java*/
Intent intent = new Intent();
intent.setAction("broadcastTest");
sendOrderedBroadcast(intent,null);
/*该文件为Receiver.java*/
public class Receiver extends BroadCastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Log.i("received broadcast");
}
}
/*该文件为AndroidManifest.xml*/
<receiver android:name=".Receiver">
<intent-filter android:priority="100">
<action android:name="broadcastTest"/>
</intent-filter>
</receiver>
Service
两种启动方式
-
startService()
- onCreate()
- onStartCommand()
- onDestory()
-
bindService()
- onCreate()
- onBind()
- onUnbind()
- onDestory()
ContentProvider
作用:借助ContentResolver在不同应用程序之间共享数据
使用步骤:
- 创建新MyContentProvider继承ContentProvider类
- 重写insert(), delete(), update(), query()方法
- 在AndroidManifest.xml文件中注册,注意authorities字段
- 在应用程序中使用
Uri uri = Uri.parse("content://cn.itcast.mycontentprovider/person");
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String []{"address", "date", "type", "body"}, null, null, null);
while(cursor.moveToNext()){
String address = cursor.getString(0);
long date = cursor.getLong(1);
int type = cursor.getInt(2);
String body = cursor.getString(3);
}
cursor.close();
ContentObserver内容观察者:当数据发生变化时,执行onChange()方法,需要在ContentProvider的delete(), insert(), update()方法使用notifyChange()方法
数据存储方式
文件存储
内部存储
将数据以文件形式存储到设备内部,data/data/packagename/files/目录下,该目录具有权限要求。当应用被删除时此目录也被删除
文件操作模式:
- MODE_PRIVARTE
- MODE_APPEND
- MODE_WORLD_WRITEABLE
- MODE_WORLD_READABLE
//保存数据
FileOutputStream fos;
try {
fos = openFileOutPut(filename, MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
//读取数据
try {
fis = openFileInput("data.txt");
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
content = new String(buffer);
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
外部存储
通常位于mnt/sdcard下,state.equals(Environment.MEDIA_MOUNTED)
使用步骤:
- Environment.getExternalStorageState()获取外部存储设备状态
- Environment.getExternlStorageDirectory()获取外部设备路径
- 进行读写操作同内部存储,需要注意操作外部设备需要在清单中设置权限
SharedPreferences
主要用来存储应用程序的配置参数,用key/value形式存储在xml文件中,只能存储float, int, long, boolean, string, stringSet类型
使用方式:
- getSharedPreferences(String name, int mode)获取对象
- 调用编辑器
- 使用编辑器进行操作
SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("name", "my name");
editor.putInt("age", 8);
editor.commit();
editor.remove("age");
editor.commit();
String name = sp.getString("name","name not exist");
ContentProvider
作用:借助ContentResolver在不同应用程序之间共享数据
使用步骤:
- 创建新MyContentProvider继承ContentProvider类
- 重写insert(), delete(), update(), query()方法
- 在AndroidManifest.xml文件中注册,注意authorities字段
- 在应用程序中使用
Uri uri = Uri.parse("content://cn.itcast.mycontentprovider/person");
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String []{"address", "date", "type", "body"}, null, null, null);
while(cursor.moveToNext()){
String address = cursor.getString(0);
long date = cursor.getLong(1);
int type = cursor.getInt(2);
String body = cursor.getString(3);
}
cursor.close();
ContentObserver内容观察者:当数据发生变化时,执行onChange()方法,需要在ContentProvider的delete(), insert(), update()方法使用notifyChange()方法
SQLite
一种广泛应用于物联网、移动设备的轻量级数据库,没有服务器进程,通过文件保存数据。支持null, integer, real, text, blob数据类型,实际上可以保存任意格式的数据,不用关心数据类型。
创建数据库
//创建MyHelper继承SQLiteOpenHelper
//重写onCreate(), onUpgrade()方法
使用数据库
增加
SQLiteDatabase db = helper.getWriteableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("price", price);
long id = db.insert("information", null, values);
db.close();
修改
SQLiteDatabase db = helper.getWriteableDatabase();
ContentValues values = new ContentValues();
values.put("price", price);
int number = db.update("information", values, "name = ?", new String[{name}]);
db.close();
return number;
删除
SQLiteDatabase db = helper.getWriteableDatabase();
int number = db.delete("information", "_id = ?", new String[]{id + ""});
db.close();
return number;
查询
查询使用query方法,返回行数集合Cursor游标接口,提供了遍历查询结果的方法
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("information", null, "_id = ?", new String[]{id + ""}), null, null, null);
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
使用数据库的时候除了上面的这些方法,还可以使用db.exceSQL(sqlString),db.rawQuery(sqlString)方法直接使用SQL语句对数据库进行操作。增删改通过exceSQL执行,没有返回值;查询通过rawQuery执行,返回行数集合。
事务
针对数据库的一组操作,其中有一条语句不能执行那么整个事务都不会执行
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext());
SQLiteDatabase db = helper.getWriteableDatabase();
db.beginTransaction();
try {
db.exceSQL("update person set account = account-100 where name = ?", new Object[]{
"zhangsan"});
db.exceSQL("update person set account = account+100 where name = ?", new Object[]{"wangwu"});
//endTransaction时会检查是否有成功标记,有则提交修改
db.setTransactionSuccessful();
} catch (Exception e) {
Log.i("SQL transaction failed!");
} finally {
db.endTransaction();
db.close();
}
网络存储
更多推荐
所有评论(0)