Android 应用开发学习笔记(1 of 2,from hitwh)
Android 应用开发
注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章开头提供了原版文章的 pdf 资源下载,推荐下载 pdf 后观看,或评论区联系我获取其他方式的下载链接。
文章目录
- Android 应用开发
- 第1章 Android 概述
- 1 安卓简介
- 1.1 Android 简介
- 1.2 Android 体系结构
- 1.3 Android 系统特点
- 第2章 Android开发环境搭建
- 第3章 Android项目的创建和运行
- 第4章 Activity
- 1 理解Activity
- 2 Activity切换不同的布局
- 3 设置Activity的布局背景
- 4 Activity生命周期
- 5 Android程序调试
- 第5章 Android用户界面
- 1 用户界面基础
- 2 界面基本组件
- 3 界面布局
- 4 界面菜单
- 选项菜单OptionsMenu
- 上下文菜单ContextMenu
- 子菜单
- 5 事件响应
- 6 附录
- 附录1:动态添加菜单(以上下文菜单为例)
- 附录2:Android剪贴板用法
- 附录3:类关系图
- 附录4:AlertDialog用法详解
- 附录5:AutoCompleteTextView用法
- 附录6:DatePicker用法
第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:动态添加菜单(以上下文菜单为例)
附录2:Android剪贴板用法
附录3:类关系图
附录4:AlertDialog用法详解
确定取消对话框
多个按钮信息框
单选列表框对话框
复选列表框对话框
自定义布局的对话框
附录5:AutoCompleteTextView用法
基本XML描述
AutoCompleteTextView示例
在res/values/arrays.xml中定义:
在MainActivity中添加代码:
附录6:DatePicker用法
基本XML描述
基本用法:
DatePicker init()方法
DatePickerDialog用法
在界面上放置一个TextView和Button(Button弹出)
DatePickerDialog来设置日期 TextView用于显示日期
添加如下代码
Android 应用开发学习笔记(1 of 2,from hitwh)相关推荐
- Android底层开发学习笔记 第一天
今天,开始学习Android底层的开发.(注:我是新手小白,纯粹学习笔记,大神们可以直接略过了) 第一部分 编译运行我的第一个Android system. 准备工作: 下载源码:包括u-boot源码 ...
- android NFC 开发学习笔记(1)
由于工作需求,最近在研究android nfc开发,借鉴了很对大神的文章在此记录自己的学习过程: 大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/d ...
- Android 应用开发学习笔记(2 of 2,from hitwh)
Android 应用开发 注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章(1 of 2)开头提供了原版文章的 pdf 资源下载,推荐下载 pdf ...
- Android应用开发学习笔记之事件处理
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android提供的事件处理机制分为两类:一是基于监听的事件处理:二是基于回调的事件处理.对于基于监听的事件处理,主 ...
- Android游戏开发学习笔记(三):视频的播放
一.在命令行下输入mksdcard 512M c:\sdcard.img命令,创建sdcard镜像文件. 二.单击Eclipse的菜单命令"Window/Preferences", ...
- android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)
/** * 画笔 * * @author 岳振华 * */ @SuppressWarnings("unused") public class PaintSruface ...
- Android深度探索(卷1)HAL与驱动开发学习笔记(8)
Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动 L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...
- Android 开发学习笔记
Android 开发学习笔记 Lesson1 (2.28) android之父: Andy Rubin(安迪 鲁宾) Lesson2 (3.3) android 的优点: 开放.网络接入自由.丰富的硬 ...
- IOS开发学习笔记(一)
概述: iOS是苹果开发的手持设备操作系统(iPhone,iPad,iPod touch,iPad mini). 基于UNIX,层次架构:核心操作系统层(Core OS)-> 核心服务层(Cor ...
最新文章
- 2022-2028年中国塑料人造革行业市场研究及前瞻分析报告
- Windows Server 2008 R2 之二十九故障转移群集(一)(
- Django1.11 扩展User属性增加头像上传功能
- linux数组shell数组添加内容,shell数组的定义与应用
- 常考数据结构与算法:反转字符串
- 如何给你的为知笔记添加一个漂亮的导航目录
- GDCM:VRDS的测试程序
- django 利用PIL 保存图片
- 数仓架构的持续演进与发展 — 云原生、湖仓一体、离线实时一体、SaaS模式
- tablueau地图标记圆形_高德地图实现自定义小蓝点 自定义点标记 绘制多边形/圆形区域 根据地图的移动显示或者隐藏自定义点标记的相关实现...
- t-sql的执行顺序
- 使用EditPlus运行C/C++
- python处理时间序列非平稳_推荐 :手把手教你用Python处理非平稳时间序列(附代码)...
- 【调剂】山东大学控制科学与工程学院生物医学实验室课题组招收硕士研究生...
- 关于文案排版的一些基本技巧
- CVPR 2021 Oral | Transformer再发力!华南理工和微信提出UP-DETR:无监督预训练检测器...
- [Android]之一:Android系统下载管理DownloadManager
- CVPR 2021 论文大盘点-去阴影、去反光、去高光、去伪影篇
- 复选框checkbox自定义样式
- 悬链线锚链力的求解方法