安卓期末复习
资料
《指导用书:安卓的全能指南》
Android 系统四大组件的名称、概念及其作用
-
Activity 活动。 是 Android 程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件。
-
Service 服务。 一般用于没有用户界面,但需要长时间在后台运行的应用。
-
Broadcast Receiver 广播接收器。 用来接收并响应广播消息的组件。
-
Content Provider 内容提供者。 Android 系统提供的一种标准的共享数据的机制,应用程序可以通过 Content Provider 访问其他应用程序的私有数据。
- Android 的四大组件是哪些。它们的作用 。
答:Activity service Content Provider BroadCastReceiver - Activity 是 Android 程序与用户交互的窗口,是 Android 构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。
- Service 是后台服务于 Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的 Intent 提供同步和异步的接口。
- Content Provider:是 Android 提供的第三方应用数据的访问方案,可以派生 Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供
- 统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。
BroadCast Receiver:接受一种或者多种 Intent 作触发事件,接受相关消息,做一些简单处理,转换成一条 Notification,统一了 Android 的事件广播模型
Logcat 有哪几种日志类型?级别是什么?这几种日志的调用代码?
详细信息 级别最低 Log.v();
调试信息 级别倒数第二低 Log.d();
通告信息 级别倒数第二低(与调试信息并列) Log.i();
警告信息 级别第二高 Log.w();
错误信息 级别最高 Log.e()。
活动的生命周期方法
- 总共有六个,需要你记住方法名
主流控件
TextView、EditText、Button、CheckBox、RadioButton、Spinner、ListView
//主要属性
<Xxx
android:id="@+id/XxxId" //id
android:layout_width="match_parent" //宽度
android:layout_height="wrap_content" //高度
android:layout_margin="xxdp" //外边距
android:padding="xxdp" //内边距
android:text="XXX" //文本
...
>
</Xxx>
Xxx xxx = (Xxx)findViewById(R.id.XxxId);
TextView:
<TextView></TextView>
textView.setText(Xxx);textView.getText();
EditText:
<EditText></EditText>
editText.getText();
Button:
<Button></Button>
//设置点击事件监听器
//写法一:
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
...
}
});
//写法二:
Button.OnClickListener buttonListener = new Button.OnClickListener(){
public void onClick(View view){
switch(view.getId()){
case R.id.xxxBtn:
break;
...
}
}
};
button1.setOnClickListener(buttonListener);
button2.setOnClickListener(buttonListener);
...
CheckBox:
<CheckBox></CheckBox>
//设置点击事件监听器
CheckBox.OnClickListener checkBoxListener = new CheckBox.OnClickListener(){
public void onClick(View view){
...
}
};
checkBox1.setOnClickListener(checkBoxListener);
checkBox2.setOnClickListener(checkBoxListener);
...
RadioButton:
<RadioGroup>
<RadioButton></RadioButton>
<RadioButton></RadioButton>
...
</RadioGroup>
//设置点击事件监听器
RadioButton.OnClickListener radioButtonListener = new RadioButton.OnClickListener(){
public void onClick(View view){
...
}
};
radioButton1.setOnClickListener(radioButtonListener);
radioButton2.setOnClickListener(radioButtonListener);
...
Spinner:
<Spinner></Spinner>
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
ListView:
<ListView></ListView>
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
listView.setAdapter(adapter);
//声明 ListView 子项的点击事件监听器
AdapterView.OnItemClickListener listViewListener = new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){
...
}
};
listView.setOnItemClickListener(listViewListener);
活动的启动模式
简答题:活动的启动模式有哪些,分别有什么特点
系统模式模式:standard
标准模式,也是系统的默认模式,启动一个activity就创建一个activity实例,不管这个实例是否存在,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity的任务栈中。
栈顶复用模式:singleTop
在这种模式下,如果新的Activity已经位于栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法被回调,通过此方法的参数我们可以取出当前的请求信息。需要注意,此Activity的onCreate,onStart方法不会被系统调用。如果新Activity不在栈顶,那么新Activity任然会被重新重建。
栈内复用模式:singleTask
这是一种单实例模式,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,系统也会回调onNewIntent方法。
例如:当前栈内情况为ABC,此时D被以singleTask的模式被启动,当前栈变为ABCD。
如果当前栈内情况为ADBC,此时D被以singleTask的模式被启动,当前栈变为AD。
单实例模式:singleInstance
这是一种加强的单实例模式,它除了具有singleTask模式的所有特性外,还加强了一点,那就是具有此种模式的Activity只能单独位于一个任务栈中,比如Activity A是singleInstance模式,A被启动时系统会为它创建一个新的任务栈,A运行在这个单独的任务栈中,后续的请求均不会再创建A,除非这个单独的任务栈被系统销毁了。
Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般可被用于启动活动、启动服务、以及发送广播等场景
什么是 Intent,它的作用是什么?
Intent是一种轻量级的消息传递机制,可以在同一个应用程序内部的不同组件之间传递信息,也可以在不同应用程序的组件之间传递信息,还可以作为广播事件发布 Android 系统消息。
作用一:启动其他组件并传递信息,如 Activity、Service
作用二:在 Android 系统上发布广播消息。
显式intent
//参数一:应用程序上下文 参数二:要启动的 Activity(接收 Intent 的目标组件)
Intent intent = new Intent(XxxActivity.this,TargetActivity.class);
startActivity(intent);
隐式intent(重要)
-
category
-
Intent 启动 Activity 的隐式启动与显式启动的定义和区别:
Intent 启动 Activity 方式可以分为显式启动和隐式启动。显式启动必须在 Intent 中指明启动的 Activity 所在的类,而隐式启动则由 Android 系统,根据 Intent 的动作和数据来决定启动哪一个 Activity。也就是说在隐式启动时,Intent 中只包含需要执行的动作和所包含的数据,而无须指明具体启动哪一个 Activity ,选择权有 Android 系统和最终用户来决定。 -
隐式启动的工作原理:
选择隐式启动 Activity,Android 系统会在程序运行时解析 Intent ,并根据一定的规则对 Intent 和 Activity 进行匹配,使 Intent 上的动作、数据与 Activity 完全吻合,由此决定启动哪一个 Activity 。
//参数一:Intent 动作 参数二:数据
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(urlString));
startActivity(intent);
intent filter(意图过滤器)
-
考察背诵,名词解释
-
对于acticon的匹配
-
对于category的匹配
什么是 Intent 过滤器?过滤机制是什么?相对应的 AndroidManifest.xml 如何配置?
Intent 过滤器是一种根据 Intent 中的动作(action)、类别(category)和数据(data)等内容,对适合接收该 Intent 的组件进行匹配和筛选的机制。
AndroidManifest.xml 文件中每个组件的
配置 AndroidManifest.xml
<activity ...>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="schemodemo" android:host="edu.hrbeu" />
</intent-filter>
</activity>
对应的 java 使用
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("shcemodemo://edu.hrbeu/path"));
startActivity(intent);
Intent 解析的匹配规则是什么?
Andoid 系统把所有应用程序包中的 Intent 过滤器集合在一 起,形成一个完整的 Intent 过滤器列表。
在 Intent 与 Intent 过滤器进行匹配时,Android 系统会将列表中所有 Intent 过滤器的“动作”和“类别”与 Intent 进行匹配,任何不匹配的 Intent 过滤器都将被过滤掉。没有指定“动作”的 Intent 过滤器可以匹配任何的 Intent ,但是没有指定“类别”的 Intent 过滤器只能匹配没有“类别”的 Intent 。
把 Intent 数据 Uri 的每个子部与 Intent 过滤器的标签中的属性进行匹配,如果标签指定了协议、主机名、路径名或 MIME 类型,那么这些属性都要与 Intent 的 Uri 数据部分进行匹配,任何不匹配的 Intent 过滤器均被过滤掉。
如果 Intent 过滤器的匹配结果多于一个,则可以根据在
活动的启动模式
standard
Android 是使用返回栈来管理活动的,在 standard 模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
singleTop
当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
singleTask
当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
singleInstance
使用前面三种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实
例的问题。
布局
-
了解常用布局
-
- 3.3四种基本布局
- 线性布局
LinearLayout
在线性布局中,所有的子元素都在垂直或水平方向按照顺序在界面上排列。 - 表格布局
TableLayout
将屏幕划分为表格,通过指定行和列可以将界面元素添加到表格中。 - 相对布局
RelativeLayout
一种非常灵活的布局方式,能够通过指定界面元素与其他元素的相对位置关系,确定界面中所有元素的布局位置。 - 绝对布局
AbsoluteLayout
能通过指定界面元素的坐标位置,来确定用户界面的整体布局。 - 网格布局
GridLayout
网格布局将用户界面划分为网格,界面元素可随意摆放在这些网格中。
RecycleView(不考察)
回调函数(第三章)
广播机制(第五章)
- 广播接收器
全局广播,局部广播,有序广播,无序广播
- 怎么写一个广播接收器,继承,重写
数据持久化(第六章)
- 文件存储
- 共享优选项(上课介绍,常用技术)
- 简单关系数据库
去实现数据持久化的几种技术
- SharedPreferences 的特点,三种访问模式:
是一种轻量级的数据保存方式,通过 SharedPreferences 开发人员可以将 NVP(Name/Value/Pair,名称/值对)保存在 Android 的文件系统中,完全屏蔽对文件系统的操作过程,仅通过调用 SharedPreferences 中的函数就可以实现对 NVP 的保存和读取。
MODE_PRIVATE 私有模式
MODE_WORLD_READABLE 全局读
MODE_WORLD_WRITEABLE 全局写
-
书P197 SimplePreferenceDemo
-
/res/raw 和 /res/xml 目录中的原始格式文件和 XML 文件:
原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件或数据文件等。在应用程序编译和打包时,/res/raw 目录下的所有文件都会保留原有格式不变。而 /res/xml 目录下一般用来保存格式化数据的 XML 文件,则会在编译和打包时将 XML 文件转换为二进制格式,用以降低存储器空间占用率和提高访问效率,在应用程序运行的时候会以特殊的方式进行访问。 -
SQLite 手动建库的常用 SQL 命令
.exit 退出 sqlite3
.tables 显示当前数据库中的所有表
.schema (表名) 查看建立表时使用的 SQL 命令
.mode column 更改结果输出格式(column、csv、html、insert、line、list、tabs、tcl)
.help 查询 sqlite3 的命令列表
-
书P215 DBAdapter P216 DBOpenHelper P221SQLiteDemo
-
Cursor 类的作用及其常用方法
数据集的指针,这个指针就是 Cursor 类。
Cursor 类支持在查询结果的数据集合中以多种方式移动,并能够获取数据集合的属性名称和序号。
常用方法:
- ContentProvider 的定义、特点及作用:
ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制。
调用者不能直接调用 ContentProvider 的接口函数,而需要使用 ContentResolver 对象,通过 URI 间接调用 ContentProvider ;ContentProvider 完全屏蔽数据提供组件的数据存储方法;ContentProvider 的数据集类似于数据库的数据表,每行是一条记录,每列具有相同的数据类型。
ContentProvider 提供了更为高级的数据共享方法,应用程序可以指定需要共享的数据,而其他应用程序则可以在不知道数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。
- 创建 ContentProvider 的步骤:
继承 ContentProvider ,并重载六个函数;
声明 CONTENT_URI ,实现 UriMatcher ;
注册 ContentProvider 。
- 继承 ContentProvider 所需要重载的六个函数是什么?
onCreate(); 一般用来初始化底层数据集和建立数据连接等工作。
getType(); 返回指定 URI 的 MIME 数据类型。
insert();delete();query();update(); 增、删、查、改
- ContentResolver 的作用,和它的 CRUD 操作?
调用者不能直接调用 ContentProvider 的接口函数,而需要使用 ContentResolver 对象,通过 URI 间接调用 ContentProvider ;调用 getContentResolver(); 函数获取 ContentResolver 对象。
查询操作
String KEY_ID = "_id";
String KEY_NAME = "name";
String KEY_AGE = "age";
String KEY_HEIGHT = "height";
//查询 ID 为2的数据
Uri uri = Uri.parse(CONTENT_URI_STRING+"/"+"2");
Cursor cursor = resolver.query(uri,new String[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},null,null,null);
//查询全部数据
Uri uri = Uri.parse(CONTENT_URI);
Cursor cursor = resolver.query(uri,new String[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},null,null,null);
添加操作
//使用 insert() 函数,添加一条数据
ContentValues values = new ContentValues();
values.put(KEY_NAME,"Tom");
values.put(KEY_AGE,21);
values.put(KEY_HEIGHT,1.81f);
Uri newUri = resolver.insert(CONTENT_URI,values);
//使用 bultInsert() 函数,批量添加数据
ContentValues[] arrayValues = new ContentValues[10];
...//实例化每一个 ContentValues
int count = resolver.bultInsert(CONTENT_URI,arrayValues);
删除操作
//删除单条数据
Uri uri = Uri.parse(CONTENT_URI_STRING+"/"+"2");
int result = resolver.delete(uri,null,null);
//删除多条数据或指定条件的数据
String selection = KEY_ID+">4";
int result = resolver.delete(CONTENT_URI,selection,null);
更新操作
//更新指定 ID 的数据,也可以如同删除操作在 selection 中声明更新条件
ContentValues values = new ContentValues();
values.put(KEY_NAME,"Tom");
values.put(KEY_AGE,21);
values.put(KEY_HEIGHT,1.81f);
Uri uri = Uri.parse(CONTENT_URI_STRING+"/"+"2");
int result = resolver.update(uri,values,null,null);
内容供应器(第三大组件,第七章)
多媒体(第八章)
服务(第四大组件,第十章)
- 生命周期(动态特点)
- 绑定服务
- start服务
- Service 的两种生命周期的名称、定义:
完整生命周期: 从 onCreate() 开始到 onDestroy() 结束,在 onCreate() 中完成 Service 的初始化工作,在 onDestroy() 中释放所有占用的资源。
活动生命周期: 从 onStart() 开始,但没有与之对应的“停止”函数,因此可以粗略地认为活动生命周期是以 onDestroy() 标志结束。
- 启动方式使用 service 需要使用什么函数、它的特点?
调用 Context.startService() 启动服务,调用 Context.stopService() 或 Service.stopSelf() 停止服务
在启动方式中,启动 Service 的组件不能够获取 Service 的对象实例,因此无法调用 Service 中的任何函数,也不能够获取 Service 中的任何状态和数据信息。
- 绑定方式使用 service 需要调用什么函数、它的特点?
调用 Context.bindService() 建立服务链接,调用 Context.unbindService() 停止服务链接
在绑定方式中,Service 的使用是通过服务链接(Connection)实现的,服务链接能够获取 Service 的对象实例,因此绑定 Service 的组件可以调用 Service 中实现的函数,或直接获取 Service 中状态和数据信息。
-
书P165 SimpleRandomServiceDemo
-
Android 中线程的概念:
线程是独立的程序单元,多个线程可以并行工作。
使用线程
//实现 Runnable 接口,并重载 run() 函数
private Runnable backgroundWork = new Runnable(){
public void run(){
...
}
};
//创建 Thread 对象,并将 Runnable 对象作为参数传递给 Thread 对象
//参数一:线程组 参数二:需要执行的 Runnable 对象 参数三:线程的名称
private Thread workThread;
workThread = new Thread(null,backgroundWork,"WorkThread");
//调用 start() 方法启动线程
workThread.start();
//通告线程准备终止
workThread.interrupt();
-
书P175 SimpleMathServiceDemo
-
什么是远程服务,何时使用远程服务?
服务和调用者在不同的两个进程中,调用过程需要跨越进程才能实现。 -
什么是 AIDL,参数传递类型有哪些?
AIDL(Android Interface Definition Language)是 Android 系统自定义的接口描述语言。
参数传递类型:in 调用者到远程服务;out 远程服务到调用者;inout 调用者到远程服务,再从远程服务到调用者。
- 远程服务的创建和调用需要使用 AIDL 语言,它的步骤是什么?
使用 AIDL 语言定义远程服务的接口;
通过继承 Service 类实现远程服务;
绑定和使用远程服务。