Android 应用开发
注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章开头提供了原版文章的 pdf 资源下载,推荐下载 pdf 后观看,或评论区联系我获取其他方式的下载链接。
第1章 Android 概述
1 安卓简介
1.1 Android 简介
- 2008年9月,google发布Android 1.0
- 是第一个免费的、开源的手机端操作系统,
- 基于Linux内核,使用Java 语言开发。
- 2008年10月,第一款Android手机HTC G1在美国上市
1.2 Android 体系结构
-
整体体系结构:应用程序层,应用程序框架层、系统运行库层、Linux内核层
-
应用程序层
- Android平台的应用层上包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序
- 例如:SMS短信,电话拨号,图片浏览器,日历,游戏, 地图,web浏览器等程序,以及开发人员开发的其他应用 程序。
-
应用程序框架层
-
系统运行库层
- 程序库:
- C库、媒体库、Surface Manager、WebKit、SGL、3D libraries、FreeType、SSL、SQLite等
- Android 运行库:
- 每一个Android应用程序都在它自己的进程中运行,都拥有一 个独立的Dalvik虚拟机实例。
- Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和 底层内存管理机制。
- 程序库:
-
关于JVM和Dalvik VM
- JVM:执行class文件(字节码 )
- Dalvik VM:执行dex文件(Dalvik Executes缩写)
- Dalvik最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备。
-
Linux内核层
- Android的核心系统服务依赖于Linux内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。
- Linux内核也同时作为硬件和软件栈之间的抽象层。
1.3 Android 系统特点
-
在内存和进程管理方面,Android有自己的运行时和虚拟机;
-
Android将界面设计与程序逻辑分离,界面布局使用XML文件,有利于界面的修改和维护;
-
Android提供轻量级的进程间通讯机制Intent,使跨进程组件通 信和发送系统广播成为可能;
-
Android提供Service作为无用户界面、长时间后台运行组件;
-
支持快速、高效的数据存储:
-
SharedPreferences、文件存储、SQLite数据库
-
Android四大核心组件:Activity、Service、Broadcast Receiver、Content Provider
-
-
为了跨进程共享数据,Android提供ContentProvider接口
-
可以无需了解数据源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作
-
-
其他
第2章 Android开发环境搭建
略
第3章 Android项目的创建和运行
-
关于Toast
-
Toast 在应用程序上浮动显示少量信息给用户,它永远不会获得焦点,不影响用户的输入等操作。
-
基本用法:
-
第4章 Activity
1 理解Activity
- Activity和界面布局layout
- 墙就类似Activity,壁橱就类似Layout布局管理器,壁橱上的东西就类似那些UI元素。
- 墙的背后或许还有我们看不见的东西,这些东西可能是Java的实体类、逻辑控制类、网络连接类等。
- 注意
- 通常一个界面布局对应一个Activity,布局文件命名:activity_***.xml, 其中***对应某个Activity名
- 但一个Activity不一定对应一个界面布局
2 Activity切换不同的布局
-
步骤:新建布局文件、创建菜单、添加菜单代码
-
在新的布局中,将一个ImageView控件拖放到界面上,并设置图片属性android:src=“@drawable/***”(先把图片复制到drawable目录中
-
创建菜单的时候:新建menu资源文件夹,然后创建菜单文件
-
新建 Android resource directory,命名为menu
-
在menu文件夹中新建 menu resource file,命名为"main_menu"
-
新建菜单项(Menu Item),设置id和title
-
在MainActivity中添加菜单代码:
-
一个问题:当切换到布局2,然后再切换到布局1后,发现布局1中的按钮click事件 后失效!
原因:onCreate()方法在Activity生命周期中只调用一次
解决方法:(代码见后)
- 将初始化代码(如click代码)单独定义为一个方法;
- 在onCreate中setContentView()之后调用一次;
- 然后在菜单onOptionsItemSelected的setContentView()之后再调用 一次。
-
-
3 设置Activity的布局背景
- 设置背景色
- 先在res/values/colors.xml中添加某个颜色值:
- <color name=“bg”>#FF0000</color>
- 然后给布局Layout设置background属性:
- android:background=“@color/bg”
- 先在res/values/colors.xml中添加某个颜色值:
- 设置背景图片:
- android:background=“@drawable/图片id” (默认图片会自动拉伸)
- 或者动态加载:getWindow().setBackgroundDrawableResource(R.drawable.***);
4 Activity生命周期
-
Activity生命周期指Activity从启动到销毁的过程。
-
Activity表现为四种状态:
- **活动状态Active:**Activity在用户界面中处于最上层,完全能被 用户看到,能够与用户进行交互。
- **暂停状态Pause:**Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出选择框时)
- **停止状态Stop:**Activity被其他Activity全部遮挡,界面完全不 能被用户看到。(如玩游戏时来电了)
- **非活动状态Dead:**Activity没有启动或者被finish()。
-
Activity栈:后进先出
-
Activity生命周期的事件回调函数
-
随着Activity自身状态的变化,Android系统会调用不同的事件回调函数(7个):
public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
-
回调函数说明:
-
Activity生命周期图
-
-
有关项目配置文件AndroidManifest.xml
-
相关解释与代码信息:
- Intent Filter就是 用来注册 Activity 、 Service 和 Broadcast Receiver 具有能在某种数据上执行一个动作的能力。使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。
-
每一个Android项目都有一个名为AndroidManifest.xml的配置文件,在所有项目中该文件的名称不变
-
该文件是Android工程的一个全局配置文件,所有在项目 中使用的组件(如 Activity,Service,Content provider和Broadcast receivers等)都要在该文件中声明。
-
该文件还可以声明一些android权限等信息。
-
-
Android工程中各个文件之间的关系
-
各类测试中Activity的回调函数调用顺序:
- 正常启动程序:onCreate → onStart → onResume【创建、启动、恢复】
- 程序启动后点击返回:onPause → onStop → onDestory【暂停、停止、再见】
- 正常启动后按Home键:onPause → onStop
- 按Home键后再单击应用进入:onRestart → onStart → onResume
- 正常启动后切换为横屏(Ctrl+F11):onPause → onStop → onDestroy → onCreate → onStart→ onResume
- 锁屏后解锁:onPause → onStop → onRestart → onStart → onResume
- 来电通话后挂机(来电是以通知的形式显示,接通后onPause部分遮挡?,挂机后onResume):onPause → onResume
5 Android程序调试
-
Android程序使用断点调试有时可能不好(如多线程程序)
-
Android程序调试还可通常使用日志文件来记录调试信息。
-
Android提供一个静态Log类,利用Log类的相关方法,将 调试信息写入日志文件。
-
LogCat工具可以实时查看日志信息。
-
Log类方法:
-
查看Log信息:
-
第5章 Android用户界面
1 用户界面基础
-
概述:用户界面UI(User Interface)是系统和用户之间进行信息交换的媒介。
-
移动用户界面设计应解决的问题
- 界面设计与程序逻辑完全分离:这不仅有利于并行开发,而且在后期修改界面时,不用再次修改程序的逻辑代码
- 根据不同型号的屏幕能自动调整界面元素的位置和尺寸:避免因为屏幕信息的变化而出现显示错误
- 增强用户体验:能够合理利用较小的屏幕显示空间,构造出符合人机交互规 律的用户界面
-
MVC(Model-View-Controller)模式:
-
Android界面框架采用了当前流行的MVC模式:
-
视图V:显示用户界面(XML布局)
-
控制器C:处理用户输入(Activity)
-
模型M:处理业务逻辑(数据/逻辑代码)
-
-
MVC目的:
- M和V的实现代码分离,从而使同一个程序可以使用不同的表 现形式,C可确保M和V的同步,一旦M改变,V能同步更新。
-
2 界面基本组件
TextView / ImageView
Button / ImageButton / ToggleButton
EditText
RadioButton / CheckBox / Spinner
ListView
-
TextView
-
基本属性:
-
在程序中控制TextView
-
补充:android:autoLink属性
- android:autoLink=“web” 自动识别web超链接
- android:autoLink=“email” 自动识别email地址
- android:autoLink=“phone” 自动识别电话号码
- android:autoLink=“all” 自动检测所有可能,并转换为可点击的链接
-
-
ImageView
-
基本XML描述:
-
在程序中控制ImageView
-
补充:ImageView从相册中选择图片
-
-
Button / ImageButton / ToggleButton
-
基本属性
-
Button:
-
ImageButton
-
ToggleButton
-
-
Button / ImageButton单击事件响应
-
ToggleButton开关切换事件响应
-
-
EditText
-
基本属性:
-
android:inputType的一些取值:
- android:inputType=“numberPassword” 数字密码框
- android:inputType=“textMultiLine” 多行文本
- android:inputType=“number” 数字键盘(只能输入数字)
- android:inputType=“phone” 拨号键盘
- android:inputType=“time” 时间键盘
-
android:digits属性:
- 该属性用于设置允许输入哪些字符。
- 如android:digits=“abcd” ,表示只能输入abcd这四种字符
-
在程序中控制EditText
-
-
RadioButton
-
单选按钮须归属一个组,每个组只能有一个选项被选中,所以通常使用的是RadioGroup
-
主要属性:
-
如何获取RadioButton选中项的值
-
RadioGroup选中项 改变事件
-
-
CheckBox(多选框/勾选框)
-
基本属性
-
如何获得多个CheckBox的选中值
-
CheckBox选中状态改变事件响应
-
-
Spinner(下拉列表)
-
基本属性
-
prompt:设置下拉列表未展开时显示的提示文本
-
popupBackground:设置下拉列表的背景,通常使用@drawable/selector,使用xml文件来定义,例子如下:
-
entries:指定下拉列表数据源,通常使用@array/spinnerArray,使用xml文件来定义,例子如下
-
-
Spinner数据填充:
-
打开res/values/strings.xml文件,添加:
<string name="major">专业</string>
-
新建res/values/arrays.xml资源文件:
<string-array name="major_array"> <item>计算机科学\</item> <item>软件工程\</item> </string-array>
-
在Spinner对象中添加属性:
-
-
如何获取Spinner选中项值
-
Spinner选中项事件响应
-
Spinner选中项事件示例
-
-
Spinner级联操作:
-
-
ListView 列表框:
-
ListView通常使用适配器来填充数据和设置显示样式。
-
ListView主要属性:
-
数据填充(静态):
-
数据填充(动态)
-
-
系统提供的其他布局:
-
ListView选项单击事件响应
-
Adapter讲解:
-
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。
-
在常见的View(ListView,GridView)等地方都需要用到Adapter。
-
BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。
-
ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
-
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
-
SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。
-
如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
-
-
如何获取选中的多选值
-
ListView示例:简单的音乐播放器(真机测试)
- 关键问题:
-
android权限问题:如添加SD卡访问权限
-
java文件操作:如何获取SD卡指定位置.mp3音乐文件
-
ListView适配器的数据填充
-
MediaPlayer基本用法:播放、暂停、继续和停止
-
- 关键问题:
-
ListView自定义布局
-
主要步骤:
- 新建Fruit类
- 自定义ListView布局
- 自定义Adapter
- 使用Adapter
-
具体代码:
-
-
3 界面布局
-
6种界面布局:
- 相对布局 RelativeLayout
- 线性布局 LinearLayout
- 框架布局 FrameLayout
- 表格布局 TableLayout
- 网格布局 GridLayout
- 绝对布局 AbsoluteLayout
-
RelativeLayout
- 相对布局是一种非常灵活的布局方式;
- 通过指定界面元素与其他元素的相对位置关系,来确定界面中所有元素的布局位置;
- 优点:能够最大程度保证在各种屏幕尺寸的手机上正确显示界面布局。
-
LinearLayout ★★★
-
线性布局是常用的一种布局方式;
-
通过设置android:orientation来确定是垂直还是水平布局
- android:orientation=“vertical” 垂直布局
- android:orientation=“horizontal” 水平布局 (默认)
-
垂直布局时:每行仅包含一个界面元素
-
水平布局时:所有界面元素都在一行
-
-
FrameLayout
-
FrameLayout中所有界面对象都是从屏幕的左上角(0,0)开始布局,不能指定位置;
-
多个组件层叠排列,上一层的会覆盖下一层的控件;
-
第一个添加的组件放到最底层,最后添加的显示在最上面。
-
-
TableLayout
-
表格布局以行列的形式管理子元素,每一行是一个TableRow布局对象,当然也可以是普通的View对象;
-
TableRow表现为一个水平LinearLayout,里面的元素会 水平排列。
-
-
GridLayout
-
Android4.0新支持的布局;
-
网格布局将用户界面划分为网格,界面元素可随意摆放在网格中,网格布局比表格布局更灵活;
-
在网格布局中界面元素可以占用多个网格。
-
-
AbsoluteLayout
- 绝对布局能通过指定界面元素的坐标位置,来确定用户界面的整体布局。已经不推荐使用。
- 绝对布局不能够根据不同屏幕对界面元素进行位置调整。
4 界面菜单
选项菜单OptionsMenu
-
概述
- Android手机上有个Menu键,当Menu按下的时候,在屏幕底部弹出一个菜单,这个菜单就叫OptionsMenu。
- 每个Activity有且只有一个OptionsMenu,它为整个Activity服务。
-
OptionsMenu基本用法
-
新建菜单资源文件并添加菜单项
-
新建res/menu/main.xml
-
添加菜单项描述:
<item android:id=“@+id/id名称” android:title=“菜单名称”></item>
-
菜单资源示例:
-
-
创建选项菜单:
-
在Activity中覆盖onCreateOptionsMenu()方法
-
-
添加选择菜单项事件:
-
在Activity中覆盖onOptionsItemSelected()方法
-
-
上下文菜单ContextMenu
-
概述:
-
上下文菜单类似Windows中的鼠标右键弹出菜单;
-
上下文菜单一般是通过长按(大约2秒)屏幕弹出。
-
-
上下文菜单的基本用法
-
新建菜单资源并添加菜单项描述
-
创建上下文菜单
在Activity中覆盖onCreateContextMenu()方法
-
添加选择菜单项事件:
在Activity中覆盖onContextItemSelected()方法
-
将上下文菜单注册到某个View组件上的:
-
子菜单
-
Android系统使用浮动窗体的形式显示菜单子项,可以更好适应小屏幕的显示方式。
-
创建子菜单的方法:
-
子菜单:在菜单项<menu></menu>中嵌套<item>即可
-
5 事件响应
以Button按钮单击事件总结一下Android事件响应方式。
-
方式1:匿名接口实现(常规)
-
方式2:内部类实现接口
-
方式3:绑定监听器 (也较常用)
-
示例:多个按钮注册到同一个事件的监听器上
-
-
方式4:activity实现接口
-
方式5:在组件的属性中绑定事件(紧耦合不推荐)
6 附录
附录1:动态添加菜单(以上下文菜单为例)
![image-20230523214408714](https://i-blog.csdnimg.cn/blog_migrate/ad2d09e770a63d20474f6587d9c0cb16.png)
附录2:Android剪贴板用法
![image-20230523214434675](https://i-blog.csdnimg.cn/blog_migrate/25529190e9a1882491466ad350aadb41.png)
附录3:类关系图
![image-20230523214453689](https://i-blog.csdnimg.cn/blog_migrate/132d27db3315dc47395569f5d2c1a39c.png)
附录4:AlertDialog用法详解
-
确定取消对话框
-
多个按钮信息框
-
单选列表框对话框
-
复选列表框对话框
-
自定义布局的对话框
附录5:AutoCompleteTextView用法
-
基本XML描述
-
AutoCompleteTextView示例
-
在res/values/arrays.xml中定义:
-
在MainActivity中添加代码:
-
附录6:DatePicker用法
-
基本XML描述
-
基本用法:
-
DatePicker init()方法
-
DatePickerDialog用法
-
在界面上放置一个TextView和Button(Button弹出)
DatePickerDialog来设置日期 TextView用于显示日期
-
添加如下代码
-