老师划的重点:
题型包括:
1、选择题 20分
2、填空题 10分
3、简答题 30分
4、程序分析 20分
5、程序设计:20分
第一章:复习eclipse应用程序目录的含义
上图中蓝色框住区域是一个完整项目的目录结构。
目录结构说明:
src/java原代码存放目录
gen/ 自动生成目录
gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
bin 用于存放ADT编译时产生的临时文件, 最终会被打包成一个xxx.apk
res/资源(Resource)目录
在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。
res/drawable
专门存放png、jpg等图标文件。在代码中使用getResources().getDrawable(resourceId)获取该目录下的资源
res/layout
专门存放xml界面文件,xml界面文件和HTML文件一样,主要用于显示用户操作界面
res/values
专门存放应用使用到的各种类型数据。不同类型的数据存放在不同的文件中。
strings.xml 定义字符串和数值
arrays.xml 定义数组
colors.xml定义颜色和颜色字串数值
dimens.xml 定义尺寸数据
styles.xml 定义样式。
res/anim/
存放定义动画的XML文件
res/xml/
在Activity中使用getResources().getXML()读取该目录下的XML资源文件
res/raw/
该目录用于存放应用使用到的原始文件,如音效文件等。编译软件时,这些数据不会被编译,它们被直接加入到程序安装包里
libs/支持库目录
程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。
assets资源目录
Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp
AndroidManifest.xml项目清单文件
这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
project.properties项目环境信息,一般是不需要修改此文件
第二章:
ui组件:布局管理器有哪些
Android常用布局:
Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是LinearLayout(线性布局)、RelationLayout(相对布局)、FrameLayout(帧布局)、AbsoluteLayout(绝对布局)、TabLayout(表格布局)。其中前3种布局用的频率一般是最高的。
绝对布局:
在此布局中的子元素的android:layout_x和android:layout_y属性将生效,用于描述该子元素的坐标位置。屏幕左上角为坐标原点(0,0),第一个0代表横坐标,向右移动此值增大,第二个0代表纵坐标,向下移动,此值增大。在此布局中的子元素可以相互重叠。在实际开发中,通常不采用此布局格式,因为它的界面代码过于刚性,以至于有可能不能很好的适配各种终端。
表格布局
适用于N行N列的布局格式。一个TableLayout由许多TableRow组成,一个TableRow就代表TableLayout中的一行。
TableRow是LinearLayout的子类,TableLayout并不需要明确地声明包含多少行、多少列,而是通过TableRow,以及其他组件来控制表格的行数和列数, TableRow也是容器,因此可以向TableRow里面添加其他组件,没添加一个组件该表格就增加一列。如果想TableLayout里面添加组件,那么该组件就直接占用一行。在表格布局中,列的宽度由该列中最宽的单元格决定,整个表格布局的宽度取决于父容器的宽度(默认是占满父容器本身)。
TableLayout继承了LinearLayout,因此他完全可以支持LinearLayout所支持的全部XML属性,除此之外TableLayout还支持以下属性:
线性布局、相对布局、帧布局是最重要的,建议将这三个布局书上的例子全部敲一遍并理解,在此就不放程序了,这个是重点!!!
android中常用的距离单位
1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多。通常不推荐使用这个。
2.dip或dp(与密度无关的像素):一个基于density(密度)的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运行时, Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
3.sp(与刻度无关的像素):同dip/dp相似,会根据用户的字体大小偏好来缩放,主要用于设置字体的大小。
4.dip和px 的区别:
首先明确一点:
HVGA屏density=160;QVGA屏density=120;
WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。
dip到px的转换公式: px = dip * (density / 160)
Android官方定义dip等价于160dpi屏幕下的一个物理像素点, 即1dip=1px。举例来说, 在 240 dpi 的屏幕上, 1dip 等于 1.5px。
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例:
1.当density=120时屏幕实际分辨率为240px*400px (两个点对应一个分辨率)状态栏和标题栏高为19px或者25dip。
横屏时屏幕宽度为400px或者800dip,工作区域高度211px或者455dip;
竖屏时屏幕宽度为240px或者480dip,工作区域高度381px或者775dip。
2.当density=160时屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高为25px或者25dip。
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者455dip;
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip。
3.当density=240时屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高为38px或者25dip。
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者455dip;
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip。
Tips: 在Android的应用包apk中,系统会根据各个设备的具体情况引用相应的资源文件(注:不加任何标签的资源是各种分辨率情况下共用的):
当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源。
文本框与编辑:框需要会从文本框与编辑获取数字,并进行简单的运算。有编程题。
文本框就是TextView,编辑是EditText,都非常简单,熟悉基本的属性就行,获取数字也是调用控件的函数。
列表视图和ListView和ListActivity
非常重要,将书上的例题敲一遍并理解,或者参考我的这篇博客,详细介绍了ListView,这个可能会出编程题,一定要理解,不理解就问问理解的同学。
http://blog.csdn.net/codeemperor/article/details/47297783
书上以下例题:
例题:2.5:SimpleListViewTest
例题:2.5:ArrayAdapterTest使用ArrayAdapter创建ListView
使用SimpleAdapter创建ListView
扩展BaseAdapter实现存储列表项的ListView
2.6进度条:
进度条,与进度对话框有着类似的功能,也可以直接在子线程中控制其进度的改变。不同的是进度条一般嵌入在我们自定义的布局文件中,而进度对话框则单独占据一个布局(该布局系统自带提供)。
xml属性设定进度最大值和已经完成的进度值,并且能够在进度改变的响应事件中获取当前的进度值。 在安卓疯狂讲义的113页,把属性稍微看一下,理解其中的例子。
Toast的使用。
Toast非常简单,在书上的131页,基本只要理解
Toast.makeText(this, "好好学习,天天向上", Toast.LENGTH_SHORT).show();
理解其中参数的意思。
第三章:Android事件处理:
Android的事件处理模型,以及实现事件监听器通常几种形式。
下面详细介绍一下一下Android点击事件的四种写法。
一、通过匿名内部类来实现
//为按钮添加监听器(匿名内部类方式)
btn_call.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
//获取要拨打的电话号码
String num = et_num.getText().toString().trim();
//创建意图
Intent intent = new Intent();
//添加行为
intent.setAction(Intent.ACTION_CALL);
//添加数据(拨打电话的行为必须为'tel:前缀')
intent.setData(Uri.parse("tel:"+num));
//实现此意图
startActivity(intent);
}
})
二、通过内部类来实现
Tips:其实第二种方法跟第一种方法在本质上没有任何差别,虽然一个是匿名内部类另外一个是内部类,但是这只是写法上的差别,两者都是通过Button对象的setOnClickListener()方法来绑定实现的。
/* *实现OnClickListener接口的一个内部类 */
class MyOnClickListener implements OnClickListener {
//重写onClick方法,当按钮被点击时,将触发此事件
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
//获取要拨打的电话号码
String num = et_num.getText().toString().trim();
//创建意图
Intent intent = new Intent();
//添加行为
intent.setAction(Intent.ACTION_CALL);
//添加数据(拨打电话的行为必须为'tel:前缀')
intent.setData(Uri.parse("tel:"+num));
//实现此意图
startActivity(intent);
}
}
}
三、由类文件去实现监听接口
1.让Activity类实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener
2.覆写接口中定义的onClick方法
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.btn_call:
call();
break;
default:
break;
}
}
3.直接使用this为控件注册事件
btn_call.setOnClickListener(this);
四、在布局文件中注册事件
1.在布局文件中添加android:onClick 属性
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="call" />
2.在相应的java代码中定义call方法
Tips:该方法的形参必须为View对象,且只能有一个。
/* *注意方法要有参数 *View对应触发事件的控件的实例 */
public void call(View v)
{
//获取要拨打的电话号码
String num = et_num.getText().toString().trim();
//创建意图
Intent intent = new Intent();
//添加行为
intent.setAction(Intent.ACTION_CALL);
//添加数据(拨打电话的行为必须为'tel:前缀')
intent.setData(Uri.parse("tel:"+num));
//实现此意图
startActivity(intent);
}
如何启动和关闭Activity
Acitivity启动其他Activity有如下两种方法
startActivity(Intent intent): 启动其它Activity
startActivityForResult(Intent intent,int requestCode): 以指请求码启动Activity,而且程序将会得到新启动Activity的结果(重写onActivityResult(…)方法获取)
相对的,也有两个关闭Activity的方法对应这两个启动的方法
finish():结束当前Activity
finishActivity(int requestCode):结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity
Handler的消息传递机制。
非常重要!!!
1. Looper、Message、Handler的关系
当我们的Android应用程序的进程一创建的时候,系统就给这个进程提供了一个Looper,Looper是一个死循环,它内部维护这个一个消息队列。Looper不停地从消息队列中取消息(Message),取到消息就发送给了Handler,最后Handler根据接收到的消息去修改UI。Handler的sendMessage方法就是将消息添加到消息队列中。
2.runOnUiThread
Activity中提供了一个runOnUiThread方法,用于进行消息处理。此方法是通过线程合并——join来实现消息处理的。
线程合并:主线程将子线程的任务拿到自己这里来执行并终止子线程。
/** * Runs the specified action on the UI thread. If the current thread is * the UI thread, then the action is executed immediately. If the * current thread is not the UI thread, the action is posted to the * event queue of the UI thread. * 上面的意思为:在UI线程中运行我们的任务,如果当前线程是UI线程,则立即执行,如果不是则该任务发送到UI线程的事件队列。 */
runOnUiThread(new Runnable() {
@Override
public void run() {
//自定义我们的业务代码
}
3.postDelayed
该方法是Handler对象提供的,Handler给消息队列发送一个消息,发送成功则返回true,否则返回false,如果返回false一般是由于looper进程不存在导致的。该方法主要用于定时任务。如果返回true也不一定代表着我们的定时任务就执行了,因为很可能在定时任务的时间未到之前我们的looper进程退出了,那么消息也就丢失了。
执行该任务的线程用的就是Handler对象所在的线程。
/**
* Causes the Runnable r to be added to the message queue, to be run
* after the specified amount of time elapses. The runnable will be run
* on the thread to which this handler is attached. Parameters: r The
* Runnable that will be executed. delayMillis The delay (in
* milliseconds) until the Runnable will be executed. Returns: Returns
* true if the Runnable was successfully placed in to the message queue.
* Returns false on failure, usually because the looper processing the
* message queue is exiting. Note that a result of true does not mean
* the Runnable will be processed -- if the looper is quit before the
* delivery time of the message occurs then the message will be dropped.
* 上面代码翻译如下:
* 该方法将一个Runnable对象r添加到消息队列,在指定的时间后会被执行。
* 这个Runnable对象会运行在当前handler所在的线程中。
* 第一个参数:Runnable 要执行的任务
* 第二个参数:delayMillis(单位:毫秒) runnable 任务被执行前的延迟时间
4.postAtTime
该方法也属于Handler对象,唯一不同的是该方法设置的定时任务是一个绝对时间,指的是Android系统的开机时间,如果想设置从当前时间算起2秒后执行该任务则可以将时间这样写:SystemClock.uptimeMillis()+2000,其中SystemClock.uptimeMillis()是系统运行时间。
/**
* Causes the Runnable r to be added to the message queue, to be run at
* a specific time given by uptimeMillis. The time-base is
* android.os.SystemClock.uptimeMillis. The runnable will be run on the
* thread to which this handler is attached. Parameters: r The Runnable
* that will be executed. uptimeMillis The absolute time at which the
* callback should run, using the android.os.SystemClock.uptimeMillis
* time-base. Returns: Returns true if the Runnable was successfully
* placed in to the message queue. Returns false on failure, usually
* because the looper processing the message queue is exiting. Note that
* a result of true does not mean the Runnable will be processed -- if
* the looper is quit before the delivery time of the message occurs
* then the message will be dropped.
* 意译:给消息队列发出一个消息,让指定的任务在指定的时间执行。这里的时间是绝对时间,是相对于android.os.SystemClock.uptimeMillis
Handler机制要重点看,书上208页。
第四章:深入理解Activity与fragment
Activity之间数据的传递。这个必须会!!!
将第四章这个代码敲一遍并理解。
实例:4.1BundleTest
Activity的生命周期。
1、startActivity开启一个Activity时, 生命周期的过程是:
onCreate ->onStart(可见不可交互) ->onResume(可见可交互)
2、点击back键关闭一个Activity时, 生命周期的过程是:
onPause(部分可见不可交互)->onStop(完全不可见)->onDestroy(销毁)
3、当开启一个新的Activity(以对话框形式), 新的activity把后面的activity给盖住一部分时, 后面的activity的生命周期执行的方法是:
onPause(部分可见, 不可交互)
注:指定Activity以对话框的形式显示, 需在activity节点追加以下主题
android:theme=”@android:style/Theme.Dialog”
4、当把新开启的Activity(以对话框形式)给关闭时, 后面的activity的生命周期执
行的方法是:
onResume(可见, 可交互)
5、当开启一个新的activity把后面的activity完全盖住时, 生命周期的方法执行顺
序是:
onPause ->onStop(完全不可见)
6、当把新开启的activity(完全盖住)给关闭时, 生命周期的方法执行顺序是:
onRestart ->onStart ->onResume(可见, 可交互)
Tips:实际工作中常用的方法以及应用场景有:
onResume 可见, 可交互.。把动态刷新的操作启动。
onPause 部分可见, 不可交互. 把动态刷新的一些操作, 给暂停了。
onCreate 初始化一些大量的数据。
onDestroy 把数据给释放掉, 节省内存。
Activity有三种状态:
1、当它在屏幕前台时,响应用户操作的Activity, 它是激活或运行状态
2、当它上面有另外一个Activity,使它失去了焦点但仍然对用户可见时, 它处于暂停状态。
3、当它完全被另一个Activity覆盖时则处于停止状态。
当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:
第五章:Intent和Intent-filter
Activity之间的跳转分为2种:
显式跳转:在可以引用到那个类, 并且可以引用到那个类的字节码时可以使用。一般用于自己程序的内部。显式跳转不可以跳转到其他程序的页面中。
隐式跳转:可以在当前程序跳转到另一个程序的页面。隐式跳转不需要引用到那个类,但是必须得知道那个界面的动作(action)和信息(category)。
Activity之间通过Intent进行通信。Intent即意图,用于描述一个页面的信息,同时也是一个数据的载体。
这个需要通过实例来理解,将书上的程序敲一遍并理解。
实例:ComponentAttr action 、Category属性与Intent-filter配置。
第六章Android应用的资源。
定义字符串、颜色、尺寸资源,数组资源以及这些资源再xml和java代码中的引用。
这个十分简单,把这一章的书看一遍就好,不会出程序题,只会出选择填空,注意细节。
第八章:Android数据存储与io
Android数据存储的主要形式
这一章绝对是重点,在Android系统中我们常用的数据存储方式有4种。1、存储中手机内存中(ROM)2、存储在SD卡中3、存储在SharedPreferences中4、存储在SQLite数据库中。每一种方式大家都要看一个实际的例子并理解,SQLite相对麻烦一些,但是不排除他会考。
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置,它提供了Android平台常规的Long、Int、String字符串型的保存,它是什么样的处理方式呢?SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。
这种方式应该是用起来最简单的Android读写外部数据的方法了。他以一种简单、 透明的方式来保存一些用户个性化设置的字体、颜色、位置等参数信息。一般的应用程序都会提供“设置”或者“首选项”的这样的界面,那么这些设置最后就可以通过Preferences来保存,而程序员不需要知道它到底以什么形式保存的,保存在了什么地方。当然,如果你愿意保存其他的东西,也没有什么限制。只是在性能上不知道会有什么问题。
其他的知识点需要去疯狂讲义认真去看,这个是重点!!!
要求会做过的实验题!!!一定要看以前的实验题,有可能代码题就是里面的,我觉得他一定会考的!
第九章使用contentprovider实现数据共享
ContentProvider简介
ContentProvider即内容提供者,是Android的四大组件之一。内容提供者是应用程序之间共享数据的接口,Android系统将这种机制应用到方方面面。比如:联系人Provider专为不同应用程序提供联系人数据;设置Provider专为不同应用程序提供系统配置信息,包括内置的设置应用程序等。当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用SharedPreferences共享数据,需要使用SharedPreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
看两个实例,这个在项目实践中并不常见,但是老师写的要求会ContentProvider是如何实现数据共享的。,所以他还是会考的,但是可能更多的是填空选择,不过还是看看程序,以防万一。
第十章Service与Broadcastreceiver
如何使用Service,包括启动,停止和配置
Service简介
很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。为了处理这种后台进程,Android引入了Service的概念。
Service在Android中是一种长生命周期的组件,它不实现任何用户界面,是一个没有界面的Activity
Service长期在后台运行, 执行不关乎界面的一些操作比如: 网易新闻服务,每隔1分钟去服务查看是否有最新新闻
Service和Thread有点相似,但是使用Thread不安全, 不严谨
Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的操作
Service的生命周期
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径。
A started service(标准开启模式)
被开启的service通过其他组件调用 startService()被创建。这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。
A bound service(绑定模式)
被绑定的service是当其他组件(一个客户)调用bindService()来创建的。客户可以通过一个IBinder接口和service进行通信。客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
Tips:Service的这两中生命周期并不是完全分开的。
也就是说,你可以和一个已经调用了 startService()而被开启的service进行绑定。比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。
Service的生命周期回调函数
和activity一样,service也有一系列的生命周期回调函数,你可以实现它们来监测service状态的变化,并且在适当的时候执行适当的工作。
Service的生命周期图
这个图说明了service典型的回调方法,尽管这个图中将开启的service和绑定的service分开,但是你需要记住,任何service都潜在地允许绑定。所以,一个被开启的service仍然可能被绑定。实现这些方法,你可以看到两层嵌套的service的生命周期。
这个应该不会重点考,为了保险还是看一两个程序例子,启动,停止和配置搞懂!!
广播有几种,如何注册一个广播。
BroadcastReceiver简介
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast/sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
无序广播
无序广播不可以被拦截,如果被拦截的话会报错:
BroadcastReceiver trying to return result during a non-ordered broadcast
所有接收无序广播的广播接收者在此广播被发送时均能接收到此广播
无序广播使用sendBroadcast方法来发送
public void sendBroadcast(View view){
//定义一个意图
Intent intent = new Intent();
//设置Action
intent.setAction("com.itheima.broadcast");
//绑定数据
intent.putExtra("data", "我是无序广播数据");
//发送无序广播
sendBroadcast(intent);
}
有序广播
有序广播可以被拦截,且优先级高的接收者可以拦截优先级低的
广播接收者的优先级的取值范围是: 1000(最高) ~ -1000(最低)
相同优先级下,接收的顺序要看在清单文件中声明的顺序,先声明的接收者比后声明的要先收到广播
无序广播使用sendOrderedBroadcast方法来发送,使用abortBroadcast方法拦截
广播接收者的优先级在清单文件中声明接收者时,在标签下通过设置”android:property”属性来设置
要知道如何注册广播!!!具体看疯狂安卓讲义,这一章应该都是选择填空,但还是看一下程序,也许他会考程序
老师说简答题可以参照博客:
http://blog.csdn.net/wwj_748/article/details/8868640
但是里面不常见的可以不用记,这种考试是不会出的很难的,面试题是对找工作的同学来说的。
祝大家有一个好的成绩~