课后题:https://blog.youkuaiyun.com/a215012954/article/details/91875090
第一章
Android操作系统
应用程序层,应用程序框架层,运行环境与库层,Linux内核层。
功能:
应用程序层:Android系统应用程序的开发者所编写的应用程序。
应用程序框架层:应用程序层的开发者提供API,是应用程序的支持框架和调用接口
运行环境与库层:
Linux内核层:Android平台的核心系统服务依赖于Linux操作系统的内核
Android通用系统架构
JDK含义
Java开发工具包和运行环境
SDK含义
软件开发工具包
ADT含义
借助Eclipse开发Android应用程序的插件
Android目录结构
1.src是源代码资源
2.gen是一个由系统自动生成的文件
3.assets存放外部资源
4.bin存放编译后的文件
5.libs存放当前项目需要加载的第三方jar文件
6.res存放资源文件
7.layout文件夹用于存放布局文件
(1)array.xml可以存放数组。
(2)strings.xml可以存放字符串。
(3)colors.xml可以存放颜色的字符串值。
(4)dimens.xml可以存放尺寸值(dimension value)。
(5)styles.xml存放样式(style)对象。
此外,res中还可以出现以下文件夹:
(1)anim文件夹用于存放动画文件
(2)xml文件夹存放任意的XML文件。
(3)raw文件夹存放直接复制到设备中的任意文件。
8.AndroidManifest.xml 是每个Android 项目都必需的文件。
引用资源的一般形式
“R.资源类型.资源名称”
R类中的所有内部类和成员都用final和static修饰,这些成员可以直接通过类名引用,无须创建R对象
布局文件的标记视图:
可视化编辑视图和代码视图
日志信息严重等级
Verbose(全部信息)、Debug(调试信息)、Info(提示信息)、Warn(警告信息)、Error(错误信息),依次使用Log.v、Log.d、Log.i、Log.w和Log.e输出,使用System.out输出的信息属于提示信息。
Android系统应用程序的后缀名是.apk
Android应用程序开发在项目创建时就实现了MVC,请说明Android项目如何实现了这一开发模式?
MVC:Model+View+Controller
(自己看着答吧,是A卷的大题)
第二章
使用布局文件设计界面
- Android布局文件位于项目结构中的res/layout 下,是一个XML文件,它的命名只能是小写字母、数字和”_”,并且数字不能开头,合法的布局文件会在R文件中生成对应的引用,当项目的R文件无法自动生成时,很多时候是因为资源文件res中命名非法造成的,应仔细检查res中的所有资源,是否存在大写字母或其他字符。
- 为了方便引用布局文件中的控件,在添加完控件之后,都应该赋子唯一的标识符,对应的属性android:id。
- Android布局文件的设计与Java GUl开发使用awt,swing编程相似,控件应放在布局管理器(或称容器)中,布局管理器之间可以相互嵌套。
给一个Activity指定布局
setContent View(R.layout.布局文件名称)
Android:通过new关键字创建控件,再将这些控件放置在相应布局容器中。
控制控件的样式,内容,行为,设置监听器
findViewByld(R.id.控件id属性)
上述方法必须位于设置布局文件setContentVicw方法之后,否则会抛出错误。
id为tv的控件是TextView 控件、在引用时可以采用如下代码;
TextView tv =(TextView)findViewById(R.id.tv);
控件的基本属性
Android系统控件共分为10类,包括了应用程序所需要的大部分控件;
1.Form Widgets(表单类控件),包括TextView(文本标签)、Button(按钮)、RadioButton(单选按钮)、CheckBox(复选框)、SeekBar(拖动条)、Spinner(下拉表)等。
2.Text Filelds(文本框控件),根据输入内容的不同分为普通文本框、密码文本框、电话文本框、数字文本框
3.Layouts(布局管理器控件),包括LinearLayout(线性布局)、RelativelLayout(相对布局)、FrameLayout(帧布局)、TableLayout(表格布局)、AbsoluteLayout(绝对布局)、GridLayout(网格布局)。
4.Images & Media(图片和媒体控件,包括ImageView(图片控件)、ImageButton(图片按钮)、VideoView(视频播放控件)等。
5.Time &.Date(时间和日期控件),包括TimePicker(时间选择器)、DatePicker(日期选择器)、AnalogClock(模拟时钟)、DigitalClock(电子时钟)等。
控件基本属性
- TextView直接继承View类
- Button控件继承TextView
- EditText控件是TextView的子类
EditText控件inputType属性取值
android:inputType取值 | 说明 |
---|---|
android:inputType=“number” | 输人内容为数字 |
android:inputType=“numberDecimal” | 输入内容为带小数点的浮点格式 |
android:inputType=“phone” | 输人内容为电话号码 |
android:inputType=“datetime” | 输入内容为日期时间 |
android:inputType=“date” | 输入内容为日期键盘 |
android:inputType=“textCapWords” | 输入文本时词首字母大写 |
android:inputType=“textCapSentences” | 输人文本时句首字母大写 |
android:inputType=“textAutoCorrect” | 输人文本时自动更正 |
android:inputType=“textAutoComplete” | 输人文本时自动完成 |
android:inputType=“textMultiLine” | 可以多行输人 |
android:inputType=“textUri” | 输入内容为网址 |
android:inputType=“textEmailAddress” | 输人内容为电子邮件地址 |
android:inputType=“textPostalAddress” | 输入内容为地址 |
android:inputType="textPassword’ | 密码输入框 |
android:inputType="textVisiblePassword | 可见密码输人框 |
-CheckBox是CompoundlButton 类的子类,是Button类的间接子类,主要功能是提供复选框。
-RadioButton是ComnoundButton类的子类,是Button类的间接子类,主要功能是单选按钮。
-SeekBar(拖动条)是ProgressBar(进度条)的间接子类,ProgressBar 是View的子类。
-监听器OnSeekBarChangeListener有3个方法,分别对应拖动开始,结束和拖动中,比较常用的是onProgressChanged方法,progress参数是拖动条被修改的取值。
ProgressBar
- ProgressBar继承自View,表示进度条
属性取值:
Widget.ProgressBar.Horizontal,水平进度条样式。
Widget.ProgressBar.Small,环形进度条,小尺寸。
Widget.ProgressBar.Large,环形进度条,大尺寸。
Widget.ProgressBar.Inverse,环形进度条,普通尺寸。
ProgressBar的常用属性
属性 | 说明 |
---|---|
android:max | 进度条的最大值 |
android:progress | 当前主进度值 |
android:secondaryProgress | 当前次进度值 |
android:progressDrawable | 进度条背景 |
布局管理器
Android布局管理器都继派自ViewGroup类,间接继承View类,用于存放控件或嵌套其他布局。Android 提供了6种布局管理器,分别是线性布局(LinearLayout),相对布局(RelativeLayout)、表格布局(TableLayout)、帧布局(FrameLayout)、绝对布局(AbsoluteLayout)和网络布局(GriLayout)。
LinearLayout常用属性
属性 | 说明 |
---|---|
android:gravity | 设置元素的对齐方式 |
android:orientation | 设置线性方向 |
android:layout_gravity | 元素属性,对齐方式 |
android:layout weight | 元素,表示所占位置的权重 |
- 相对布局管理器:元素可以使用它们彼此之间的位置关系,确定摆放位置
RelativeLayout常用属性
属性 | 说明 |
---|---|
android:Iayout_below | 在某元素的下方 |
android:Iayout_above | 在某元素的上方 |
android:layout_toLeftOf | 在某元素的左边 |
android:layout_toRightOf | 在某元素的右边 |
android:layout_alignTop | 本元素的上边缘和某元素的上边缘对齐 |
android:layout_alignlLeft | 本元素的左边缘和某元素的左边缘对齐 |
android:layout_alignBottom | 本无素的下边缘和某元素的下边缘对齐 |
android:layout alignRight | 本元素的右边缘和某元素的下边缘对齐 |
android:layout_centerHrizontal | 水平居中 |
android:layout_centerVertical | 垂直居中 |
android:layout centerlnparent | 相对于父元素完全居中 |
android :layout_alignParentBottom | 贴紧父元素的下边缘 |
android:layout _alignParentLeft | 贴紧父元素的左边缘 |
android:layout_alignParentRight | 贴紧父元素的右边缘 |
android:layout_alignParentTop | 贴紧父元素的上边缘 |
android:layout _marginBottom | 底边缘的距离 |
android:layout_marginLeft | 左边缘的距离 |
android:layout _marginRight | 右边缘的距离 |
android:layout_marginTop | 上边缘的距离 |
TableLayout
表格布局是以行为单位的布局方式,它不需要指明有多少行、多少列,通过添加TableRow或其他元素动态确定行数和列数
TableLayout属性
属性 | 说明 |
---|---|
android:shrinkColumns | 允许收缩的列 |
android:stretchColumns | 允许拉伸的列 |
android:collapseColumns | 允许被隐藏的列 |
android:layout_column | 元素属性,所处列 |
android:layout_span | 元素属性,跨越列数 |
绝对布局管理器以屏幕左上角为左边原点(0,0)
ImageView常用属性
属性 | 说明 |
---|---|
android:adjustViewBounds | 是否保持宽高比,与maxWidth、MaxHeight 一起使用 |
android:maxHeight、android:maxWidth | 最大宽高,与setAdjustViewlBounds一起使用 |
android:scaleType | 图片的缩放模式 |
android:sre | 设置View的drawable |
ImageView在设置显示内容时可以采用下面4种方法:
void setlmageBitmap(Bitmap bm)
void setlmageDrawable(Drawable drawable)
void setlmageResource(int resId)
void setlmageURI(Uri uri)
ImageButton
图片按钮继承ImageView,其本质是ImageView的特例
数据适配器
数据适配器顾名思义就是把不同格式的数据(数组或集合等)按统一格式填充给控件,使得这些控件在呈现数据时不用关心数据的差异性,经常用到的适配器类有ArrayAdapter、SimpleAdapter、SimplaCursorAdapter和BaseAdapter。
ArrayAdapter常用构造方法如下:
ArayAdapter(Context context,int resource,int textViewResourceld)
ArayAdapter(Context context,int resource,List< T> objects)
ListView直接继承AbsListView间接继承AdapterView
DatePicker 和TimePicker都继承FrameLayout类,分别用于选择日期和时间。
DatePicker常用属性
属性 | 说明 |
---|---|
android:calendar TextColor | 日历列表演示 |
android:calendar ViewShown | 是否显示日历视图 |
android:datePickerMode | 日历模式 |
android:endYear | 允许选择的结束年份 |
android:startYear | 运行选择的开始年份 |
android:firstDayOfWeek | 设置周几作为每周的第一天 |
android:maxDate | 允许设置的最大日期 |
android:minDate | 允许设置的最小日期 |
子线程借助Handler修改UI
Handler类位于android.os包中,其作用是发送和处理Message 对象、Runnable对象
第三章(考大题)
Activity三种状态:激活态,暂停态,停止态
生命周期方法:
①onCreate(),当Activity被创建时调用。
②onStart(),当Activity 被创建后即将可见时调用。
③onResume(),当Activity位于设备最前端,对用户可见时调用。
④onPause(),当另外一个Activity遮挡当前Activity,当前Activity 被切换到后台时调用。
⑤onRestart(),当Activity执行完onStop方法,又被用户打开时调用。
⑥onStop(),如果另一个Activity完全遮挡了当前Activity时,该方法被调用。
⑦onDestroy(),当Activity被销毁时调用。
Activity的生命周期图
使用Intent启动Activity
启动Activity可以分别使用startActivity(lntent intent)方法和startActivityForResult(Intent intent,int requestCode)方法。
问:请描述Activity生命周期函数以及调用的先后顺序
问:Activity传参到页面上并读出(A:打开短信(Intent)B:动态)
第四章
Android 中定义了如下的资源类型:
(1)布局资源。定义应用程序中UI布局的xml文件,保存在res/layout目录下,通过R.layout类访问。
(2)菜单资源。定义应用程序菜单的内容,保存在res/menu目录下,通过R.menu类访问。
(3)“值”资源。应用程序中所需要的字符串、尺寸、颜色等均可在res/values目录下定义相应的xml文件,通过R.<resource_type>类来访问:
(4)图片资源。定义各种图片或者xml的图片资源,保存在res/drawable目录下,通过R.drawable类访问。
(5)动画资源。定义预设动画,保存在res/anim目录下,通过R.anim类访问。
(6)样式资源。定义用户界面元素的外观和格式,保存在res/values/styles.xml文件中,通过R.style类访问。
布局资源的访问方式有以下两种:
Java 代码:R.layout.filename
Xml代码:@[packagename]layout/filename
菜单资源有大题P117
菜单资源只能通过Java代码访问,访问方式为R.menu.filename。
options menu 创建步骤加下:
(1)创建菜单资源xml文件。
(2)重写Activity的onCreateOptionsMenu方法,实现创建菜单功能。
(3)当菜单项(Menultem)被选中时,重写Activity的onOptionsMenuSelected 方法响应事件。
Menu的菜单项可以是Menultem,也可以是SubMenu。Menultem 直接显示在Menu上;
ContextMenu的创建步骤如下:
(1)创建菜单资源xml文件。
(2)重写Activity的onCreateOptionsMenu方法,实现创建菜单功能。
(3)当菜单项(Menultem)被选中时,重写Activity 的onOptionsMenuSelected方法响应事件。
(4)在Activity 中调用registerForContextMenu 为控件注册 ContextMenu.
当ActionBar 不能显示全部菜单项时,可以将其隐藏起来,变为二级菜单。
字符串:在Jave代码中获取id的格式为R.string.< string_name>,获取字符串的格式为getResource().getString()
颜色资源:在Jave代码中获取id的格式为R.color.<color_name>,获取颜色值的格式为getResource().getColor()
尺寸资源:在Jave代码中获取id的格式为R.dimen.<dimen_name>,获取尺寸值的格式为getResourceO.getDimen()
定义两个style资源的相关代码:
<!--定义文本默认样式-->
<style name="textDefault">
<item nane ="android:textSize">16sp</item>
<item name ="android:textColor">#000</item>
<iteM nane ="android:textStyle">bold </item>
<item name ="android:layout_height">50dp</item>
<item nane ="android:gravity">center_vertical</item>
<item name ="android:layout_marginLeft">16dp</item>
</style>
<!--定义间隔线样式-->
<style nane="1ineGray">
<item name ="android:layout_width">match_parent</item>
<item name ="android:layout_height">0.5dp</item>
<item name ="android:background">#ccc</item>
</style>
第五章
创建菜单,只需要重写Activity的onCreateOptionsMenu方法
监听菜单,中需要重写Activity的onOptionsltemSeleted 方法
创建菜单的代码
public boolean onCreateOptionMenu(Menu menu)(
menu.add(Menu.NONE,Menu.FIRST,1,“新建”).setIcon(android.R.drawable.ic_menu_add);
menu.add(Menu.NONE,Menu.FIRST+1,2,”编辑”).setIcon(android.R.drawable.ic_menu_edit);
menu.add(Menu.NONE,Menu.FIRST+2,3,“删除”).BetIcon(android.R.drawable.ic_menu_delete);
menu,add(Memu.NONE,Menu.FIRST+3,4,”帮助”).setIcon(android.R.drawable.ic_menu_help);
return true;
}
处理菜单项选中相关方法的代码
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case Menu.FIRST:
tv.append("MenuItem-新建被选中\n");
break;
caes Menu.FIRST+1:
tv.append("MenuItem-编辑被选中\n");
break;
case Menu.FIRST+2:
tv.append("MenuItem-删除被选中\n");
break;
case Menu.FIRST+3:
tv.append("MenuItem-帮助被选中\n");
break;
}
return false;
}
Mean添加子菜单使用addSubMenu方法
添加子菜单的代码
SubMenu subMore = menu.addSubMenu(Menu.NONE,Menu.FIRST+4,5,“更多”);
subMore.setHeaderTitle("更多");
subMore.setHeaderIcon(android.R.drawable.ic_menu_more);
subMore.add(Menu.NONE,Menu.FIRST +5,6,“版本检查”);
subMore.add(Menu.NONE,Menu.FIRST +6,7,“关于我们”);
NotificationManager是一个重要的系统级服务,该对象位于应用程序的框架层中,应用程序可以通过它向系统发送全局的通知。
如果想显示为水平进度条,可以调用setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)来完成。
第八章
Service可以通过Intent来启动(Start),也可以绑定(Bind)到宿主对象(启动Service的对象)
Service常用方法说明
方法 | 说明 |
---|---|
onBind(Intent intent) | 抽象方法,绑定模式时执行该方法,通过IBinder对象访问Service |
onCreate() | Service组件创建时执行 |
onDestroy() | Service组件销毁时执行 |
onStartCommand(Intent intent,int flags,int startld) | 开始模式时执行该方法。每次执行startService,该方法都会被执行 |
onUnbind(Intent intent) | 接触绑定时执行 |
stopSelf() | 停止Service组件 |
AndroidManifest.xml文件
<!--配置Service -->
<service android:name ="edu.freshen.service.MyService">
<intent-filter>
<action android:name ="edu.freshen.service.MyService.ACTION"/>
</intent-filter>
</service>
Service生命周期
Service的启动模式
启动Service组件和停止Service组件的方法都位于Context类,在Activity中可以直使用。方法的功能与参数意义如下:
- startService(Intent service),以Start 模式启动Service组件,参数service是目标组件。
- stopService(Intent service),停止 Start 模式启动的Service组件,参数Service是目标组件。
- bindService(Intent service,ServiceConnection conn,int flags),以Bind 模式启动Service 组件,参数service是目标组;conn是与目标组件链接的对象,不可以是null;flags是绑定模式,可以取值为Context,BIND_AUTO_CREATE、Context.BIND_NOT_FOREGROUND等。前者表示当收到绑定请求时,如果服务商未创建,则即刻创建。若系统内存不足,需要先销毁优先级低的组件来释放内存,并且只有当绑定该服务的“启动者”被销毁时,服务才可被销毁。后者表示绑定该服务的“启动者”不具有前台优先级,仅在后台运行。
- unbindService(ServiceConnection conn),解除绑定模式的Service组件,conn是绑定时的链接对象。
远程Service
使用AIDL定义远程Service可以按照以下两步进行:
(1)在项目中创建AIDL文件,这是一种后缀名为.aidl的普通文件。在该文件中定义接口,声明方法,与在Java文件中的操作一样。不同的是,AIDL中所用到的类型(除基本数据、String、List、Map和CharSequence)即使在同一个包中,都需要明确引人
(2)新建Service组件,使用内部类实现AIDL中定义接口的相关方法,在onBind生命周期方法中返回该内部类的对象。
在不同的项目中访问远程Service
在Activity中绑定并访问远程Service组件 edu.freshen.rs.RemoteService.ACTION
广播
广播的权限管理主要为了解决如下两个问题:
- 何种接收器有权接收广播,这通过配置uses-permission实现。
- 何种广播有权向接收器发送广播,这通过设置 receiver 的 android:permission属性实现。
常用系统广播事件
广播事件 | 说明 |
---|---|
ACTION_BATTERY_CHANGED | 充电状态,或者电池的电量发生变化时发送广播,只能通过动态注册接收 |
ACTION_BOOT_COMPLETED | 系统启动完成后发送广播,该广播仅发送一次 |
ACTION_PACKAGE_ADDED | 成功安装APK之后发送广播 |
ACTION_PACKAGE_REMOVED | 成功删除某个APK之后发送广播 |
ACTION POWER_CONNECTED | 插上外部电源时发送广播 |
ACTION_POWER_DISCONNECTED | 断开外部电源连接时发送广播 |
ACTION_REBOOT | 重启设备时发送广播 |
ACTION_SHUTDOWN | 关闭系统时发送广播 |
ACTION_SCREEN_OFF | 屏幕被关闭之后发送广播 |
ACTION_SCREEN_ON | 屏幕被打开之后发送广播 |
ACTION_TIME_CHANGED | 时间被设置时发送广播 |
ACTION_TIME_TICK | 当前时间改变时发送广播;每分钟都发送,只能通过动态注册接收 |
ACTION_BATTERY_CHANGED | 充电状态或者电池的电量发生变化时发送广播,只能通过动态注册接收 |
Telephony.SMS_RECEIVED | 短信到达广播,使用pdus作为key即可从Intent中获取短信内容 |
广播的action名称为Android.provier.Telephony.SMS_RECEIVED,并且在intent中封装了短信内容。使用参数值pdus即可从intent中获取短信内容。pdus是一个Object类型的数组,每一个Object对象都是一个byte字节数组,即每一元素都对应一条短信内容。
问:Android中的广播有哪些分类?使用什么方法发送这些广播?
答:Anddrod系统中的广播可以分为普通广播和有序广播。
普通广播使用sendBroadcast方法发送,有序广播使用sendOrderedBroadcast方法发送。