考试题型

  • 选择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

四大组件

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)

使用步骤:

  1. Environment.getExternalStorageState()获取外部存储设备状态
  2. Environment.getExternlStorageDirectory()获取外部设备路径
  3. 进行读写操作同内部存储,需要注意操作外部设备需要在清单中设置权限
SharedPreferences

主要用来存储应用程序的配置参数,用key/value形式存储在xml文件中,只能存储float, int, long, boolean, string, stringSet类型

使用方式:

  1. getSharedPreferences(String name, int mode)获取对象
  2. 调用编辑器
  3. 使用编辑器进行操作
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();
}
网络存储
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐