Android 应用开发学习笔记(1 of 2,from hitwh)

Android 应用开发

注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章开头提供了原版文章的 pdf 资源下载,推荐下载 pdf 后观看,或评论区联系我获取其他方式的下载链接。

第1章 Android 概述

1 安卓简介

1.1 Android 简介
  1. 2008年9月,google发布Android 1.0
  2. 是第一个免费的、开源的手机端操作系统,
  3. 基于Linux内核,使用Java 语言开发。
  4. 2008年10月,第一款Android手机HTC G1在美国上市
1.2 Android 体系结构
  1. 整体体系结构:应用程序层,应用程序框架层、系统运行库层、Linux内核层

    image-20230522190616118
  2. 应用程序层

    • Android平台的应用层上包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序
    • 例如:SMS短信,电话拨号,图片浏览器,日历,游戏, 地图,web浏览器等程序,以及开发人员开发的其他应用 程序。
  3. 应用程序框架层

    image-20230522191054238
  4. 系统运行库层

    • 程序库:
      • C库、媒体库、Surface Manager、WebKit、SGL、3D libraries、FreeType、SSL、SQLite
    • Android 运行库:
      • 每一个Android应用程序都在它自己的进程中运行,都拥有一 个独立的Dalvik虚拟机实例。
      • Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和 底层内存管理机制。
  5. 关于JVM和Dalvik VM

    • JVM:执行class文件(字节码 )
    • Dalvik VM:执行dex文件(Dalvik Executes缩写)
    • Dalvik最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备。
  6. Linux内核层

    • Android的核心系统服务依赖于Linux内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。
    • Linux内核也同时作为硬件和软件栈之间的抽象层。
1.3 Android 系统特点
  1. 在内存和进程管理方面,Android有自己的运行时和虚拟机;

  2. Android将界面设计与程序逻辑分离,界面布局使用XML文件,有利于界面的修改和维护;

  3. Android提供轻量级的进程间通讯机制Intent,使跨进程组件通 信和发送系统广播成为可能;

  4. Android提供Service作为无用户界面、长时间后台运行组件;

  5. 支持快速、高效的数据存储:

    • SharedPreferences、文件存储、SQLite数据库

    • Android四大核心组件:Activity、Service、Broadcast Receiver、Content Provider

      image-20230522200113269
  6. 为了跨进程共享数据,Android提供ContentProvider接口

    • 可以无需了解数据源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作

      image-20230522201007732
  7. 其他

    image-20230522201109489

第2章 Android开发环境搭建

第3章 Android项目的创建和运行

  1. 关于Toast

    • Toast 在应用程序上浮动显示少量信息给用户,它永远不会获得焦点,不影响用户的输入等操作。

    • 基本用法:

      image-20230522203411696

第4章 Activity

1 理解Activity

  1. Activity和界面布局layout
    • 墙就类似Activity,壁橱就类似Layout布局管理器,壁橱上的东西就类似那些UI元素。
    • 墙的背后或许还有我们看不见的东西,这些东西可能是Java的实体类、逻辑控制类、网络连接类等。
  2. 注意
    • 通常一个界面布局对应一个Activity,布局文件命名:activity_***.xml, 其中***对应某个Activity名
    • 但一个Activity不一定对应一个界面布局

2 Activity切换不同的布局

  1. 步骤:新建布局文件、创建菜单、添加菜单代码

    • 在新的布局中,将一个ImageView控件拖放到界面上,并设置图片属性android:src=“@drawable/***”(先把图片复制到drawable目录中

    • 创建菜单的时候:新建menu资源文件夹,然后创建菜单文件

      • 新建 Android resource directory,命名为menu

      • 在menu文件夹中新建 menu resource file,命名为"main_menu"

      • 新建菜单项(Menu Item),设置id和title

      • 在MainActivity中添加菜单代码:

        image-20230522210231419 image-20230522210247400
      • 一个问题:当切换到布局2,然后再切换到布局1后,发现布局1中的按钮click事件 后失效!

        原因:onCreate()方法在Activity生命周期中只调用一次

        解决方法:(代码见后)

        1. 将初始化代码(如click代码)单独定义为一个方法;
        2. 在onCreate中setContentView()之后调用一次;
        3. 然后在菜单onOptionsItemSelected的setContentView()之后再调用 一次。
        image-20230522210449250

3 设置Activity的布局背景

  1. 设置背景色
    • 先在res/values/colors.xml中添加某个颜色值:
      • <color name=“bg”>#FF0000</color>
    • 然后给布局Layout设置background属性:
      • android:background=“@color/bg”
  2. 设置背景图片:
    • android:background=“@drawable/图片id” (默认图片会自动拉伸)
    • 或者动态加载:getWindow().setBackgroundDrawableResource(R.drawable.***);

4 Activity生命周期

  1. Activity生命周期指Activity从启动到销毁的过程。

  2. Activity表现为四种状态:

    • **活动状态Active:**Activity在用户界面中处于最上层,完全能被 用户看到,能够与用户进行交互。
    • **暂停状态Pause:**Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出选择框时)
    • **停止状态Stop:**Activity被其他Activity全部遮挡,界面完全不 能被用户看到。(如玩游戏时来电了)
    • **非活动状态Dead:**Activity没有启动或者被finish()。
  3. Activity栈:后进先出

    image-20230522211131442
  4. 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();
      }
      
    • 回调函数说明:

      image-20230522211319457
    • Activity生命周期图

      image-20230522211548658
  5. 有关项目配置文件AndroidManifest.xml

    • 相关解释与代码信息:

      image-20230522211841127
      • Intent Filter就是 用来注册 Activity 、 Service 和 Broadcast Receiver 具有能在某种数据上执行一个动作的能力。使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。
    • 每一个Android项目都有一个名为AndroidManifest.xml的配置文件,在所有项目中该文件的名称不变

    • 该文件是Android工程的一个全局配置文件,所有在项目 中使用的组件(如 Activity,Service,Content provider和Broadcast receivers等)都要在该文件中声明。

    • 该文件还可以声明一些android权限等信息。

  6. Android工程中各个文件之间的关系

    image-20230522214230111
  7. 各类测试中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程序调试

  1. Android程序使用断点调试有时可能不好(如多线程程序)

  2. Android程序调试还可通常使用日志文件来记录调试信息。

  3. Android提供一个静态Log类,利用Log类的相关方法,将 调试信息写入日志文件。

  4. LogCat工具可以实时查看日志信息。

  5. Log类方法:

    image-20230522221028708
    • 查看Log信息:

      image-20230522221133989

第5章 Android用户界面

1 用户界面基础

  1. 概述:用户界面UI(User Interface)是系统和用户之间进行信息交换的媒介。

  2. 移动用户界面设计应解决的问题

    • 界面设计与程序逻辑完全分离:这不仅有利于并行开发,而且在后期修改界面时,不用再次修改程序的逻辑代码
    • 根据不同型号的屏幕能自动调整界面元素的位置和尺寸:避免因为屏幕信息的变化而出现显示错误
    • 增强用户体验:能够合理利用较小的屏幕显示空间,构造出符合人机交互规 律的用户界面
  3. MVC(Model-View-Controller)模式:

    • Android界面框架采用了当前流行的MVC模式:

      • 视图V:显示用户界面(XML布局)

      • 控制器C:处理用户输入(Activity)

      • 模型M:处理业务逻辑(数据/逻辑代码)

        image-20230522221536364
    • MVC目的:

      • M和V的实现代码分离,从而使同一个程序可以使用不同的表 现形式,C可确保M和V的同步,一旦M改变,V能同步更新。

2 界面基本组件

TextView / ImageView

Button / ImageButton / ToggleButton

EditText

RadioButton / CheckBox / Spinner

ListView

  1. TextView

    • 基本属性:

      image-20230522221903215
    • 在程序中控制TextView

      image-20230522222103447
    • 补充:android:autoLink属性

      • android:autoLink=“web” 自动识别web超链接
      • android:autoLink=“email” 自动识别email地址
      • android:autoLink=“phone” 自动识别电话号码
      • android:autoLink=“all” 自动检测所有可能,并转换为可点击的链接
  2. ImageView

    • 基本XML描述:

      image-20230522223258767
    • 在程序中控制ImageView

      image-20230522223441720
    • 补充:ImageView从相册中选择图片

      image-20230522223525418
  3. Button / ImageButton / ToggleButton image-20230522224209746

    • 基本属性

      • Button:

        image-20230522224257434
      • ImageButton

        image-20230522224322557
      • ToggleButton

        image-20230522224500754
    • Button / ImageButton单击事件响应

      image-20230522224400631
    • ToggleButton开关切换事件响应

      image-20230522224741922
  4. EditText

    • 基本属性:

      image-20230522224836470
    • android:inputType的一些取值:

      • android:inputType=“numberPassword” 数字密码框
      • android:inputType=“textMultiLine” 多行文本
      • android:inputType=“number” 数字键盘(只能输入数字)
      • android:inputType=“phone” 拨号键盘
      • android:inputType=“time” 时间键盘
    • android:digits属性:

      • 该属性用于设置允许输入哪些字符。
      • 如android:digits=“abcd” ,表示只能输入abcd这四种字符
    • 在程序中控制EditText

      image-20230522225339557
  5. RadioButton image-20230522225413979

    • 单选按钮须归属一个组,每个组只能有一个选项被选中,所以通常使用的是RadioGroup

    • 主要属性:

      image-20230522225744953
    • 如何获取RadioButton选中项的值

      image-20230522230226777
    • RadioGroup选中项 改变事件

      image-20230522230433147
  6. CheckBox(多选框/勾选框)

    • 基本属性

      image-20230523100304875
    • 如何获得多个CheckBox的选中值

      image-20230523100350262
    • CheckBox选中状态改变事件响应

      image-20230523100531879
  7. Spinner(下拉列表)

    • 基本属性

      image-20230523100653757
      • prompt:设置下拉列表未展开时显示的提示文本

      • popupBackground:设置下拉列表的背景,通常使用@drawable/selector,使用xml文件来定义,例子如下:

        image-20230523101133839
      • entries:指定下拉列表数据源,通常使用@array/spinnerArray,使用xml文件来定义,例子如下

        image-20230523104026170
    • 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对象中添加属性:

        image-20230523104300622
    • 如何获取Spinner选中项值

      image-20230523104653992
    • Spinner选中项事件响应

      image-20230523110313507
      • Spinner选中项事件示例

        image-20230523110354097
    • Spinner级联操作:

      image-20230523110603237image-20230523110617555

      image-20230523110710559
  8. ListView 列表框:

    • ListView通常使用适配器来填充数据和设置显示样式。

    • ListView主要属性:

      image-20230523111826647
      • 数据填充(静态):

        image-20230523111904553
      • 数据填充(动态)

        image-20230523112102551
    • 系统提供的其他布局:

      image-20230523112227169
    • ListView选项单击事件响应

      image-20230523112258474
    • Adapter讲解:

      • Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。

      • 在常见的View(ListView,GridView)等地方都需要用到Adapter。

        image-20230523112602173
      • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。

      • ArrayAdapter支持泛型操作,最为简单,只能展示一行字。

      • SimpleAdapter有最好的扩充性,可以自定义出各种效果。

      • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。

      • 如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

    • 如何获取选中的多选值

      image-20230523112802214
    • ListView示例:简单的音乐播放器(真机测试)

      • 关键问题:
        • android权限问题:如添加SD卡访问权限

        • java文件操作:如何获取SD卡指定位置.mp3音乐文件

        • ListView适配器的数据填充

        • MediaPlayer基本用法:播放、暂停、继续和停止

    • ListView自定义布局

      • 主要步骤:

        • 新建Fruit类
        • 自定义ListView布局
        • 自定义Adapter
        • 使用Adapter
      • 具体代码:

        image-20230523113234004 image-20230523113253538 image-20230523113331927 image-20230523113344189 image-20230523113353715

3 界面布局

  1. 6种界面布局:

    • 相对布局 RelativeLayout
    • 线性布局 LinearLayout
    • 框架布局 FrameLayout
    • 表格布局 TableLayout
    • 网格布局 GridLayout
    • 绝对布局 AbsoluteLayout
  2. RelativeLayout

    • 相对布局是一种非常灵活的布局方式;
    • 通过指定界面元素与其他元素的相对位置关系,来确定界面中所有元素的布局位置;
    • 优点:能够最大程度保证在各种屏幕尺寸的手机上正确显示界面布局。
  3. LinearLayout ★★★

    • 线性布局是常用的一种布局方式;

    • 通过设置android:orientation来确定是垂直还是水平布局

      • android:orientation=“vertical” 垂直布局
      • android:orientation=“horizontal” 水平布局 (默认)
    • 垂直布局时:每行仅包含一个界面元素

    • 水平布局时:所有界面元素都在一行

      image-20230524092243617
  4. FrameLayout

    • FrameLayout中所有界面对象都是从屏幕的左上角(0,0)开始布局,不能指定位置;

    • 多个组件层叠排列,上一层的会覆盖下一层的控件;

    • 第一个添加的组件放到最底层,最后添加的显示在最上面。

      image-20230524092259269
  5. TableLayout

    • 表格布局以行列的形式管理子元素,每一行是一个TableRow布局对象,当然也可以是普通的View对象;

    • TableRow表现为一个水平LinearLayout,里面的元素会 水平排列。

      image-20230524092314409
  6. GridLayout

    • Android4.0新支持的布局;

    • 网格布局将用户界面划分为网格,界面元素可随意摆放在网格中,网格布局比表格布局更灵活;

    • 在网格布局中界面元素可以占用多个网格。

      image-20230524092357904
  7. AbsoluteLayout

    • 绝对布局能通过指定界面元素的坐标位置,来确定用户界面的整体布局。已经不推荐使用。
    • 绝对布局不能够根据不同屏幕对界面元素进行位置调整。

4 界面菜单

选项菜单OptionsMenu
  1. 概述

    • Android手机上有个Menu键,当Menu按下的时候,在屏幕底部弹出一个菜单,这个菜单就叫OptionsMenu。
    • 每个Activity有且只有一个OptionsMenu,它为整个Activity服务。
  2. OptionsMenu基本用法

    • 新建菜单资源文件并添加菜单项

      • 新建res/menu/main.xml

      • 添加菜单项描述:

        <item android:id=“@+id/id名称” android:title=“菜单名称”></item>

      • 菜单资源示例:

        image-20230523174346232
    • 创建选项菜单:

      • 在Activity中覆盖onCreateOptionsMenu()方法

        image-20230523202810868
    • 添加选择菜单项事件:

      • 在Activity中覆盖onOptionsItemSelected()方法

        image-20230523203405062
上下文菜单ContextMenu
  1. 概述:

    • 上下文菜单类似Windows中的鼠标右键弹出菜单;

    • 上下文菜单一般是通过长按(大约2秒)屏幕弹出。

  2. 上下文菜单的基本用法

    • 新建菜单资源并添加菜单项描述

    • 创建上下文菜单

      在Activity中覆盖onCreateContextMenu()方法

      image-20230523203733932
    • 添加选择菜单项事件:

      在Activity中覆盖onContextItemSelected()方法

      image-20230523204940369
    • 将上下文菜单注册到某个View组件上的:

      image-20230523205700162
子菜单
  • Android系统使用浮动窗体的形式显示菜单子项,可以更好适应小屏幕的显示方式。

  • 创建子菜单的方法:

    • 子菜单:在菜单项<menu></menu>中嵌套<item>即可

      image-20230523205916564

5 事件响应

以Button按钮单击事件总结一下Android事件响应方式。

  1. 方式1:匿名接口实现(常规)

    image-20230523210217332
  2. 方式2:内部类实现接口

    image-20230523212706166
  3. 方式3:绑定监听器 (也较常用)

    image-20230523212834295
    • 示例:多个按钮注册到同一个事件的监听器上

      image-20230523213331392
  4. 方式4:activity实现接口

    image-20230523213413868
  5. 方式5:在组件的属性中绑定事件(紧耦合不推荐)

    image-20230523213554432

6 附录

附录1:动态添加菜单(以上下文菜单为例)
image-20230523214408714
附录2:Android剪贴板用法
image-20230523214434675
附录3:类关系图
image-20230523214453689
附录4:AlertDialog用法详解
  1. 确定取消对话框

    image-20230523214554617
  2. 多个按钮信息框

    image-20230523214611859
  3. 单选列表框对话框

    image-20230523214626079
  4. 复选列表框对话框

    image-20230523214709412
  5. 自定义布局的对话框

    image-20230523214835585 image-20230523215340469
附录5:AutoCompleteTextView用法
  1. 基本XML描述

    image-20230523215432553
  2. AutoCompleteTextView示例

    • 在res/values/arrays.xml中定义:

      image-20230523215508645
    • 在MainActivity中添加代码:

      image-20230523215547267
附录6:DatePicker用法
  1. 基本XML描述

    image-20230523215758162
  2. 基本用法:

    image-20230523215824695
  3. DatePicker init()方法

    image-20230523215845414
  4. DatePickerDialog用法

    • 在界面上放置一个TextView和Button(Button弹出)

      DatePickerDialog来设置日期 TextView用于显示日期

      image-20230523220000430
    • 添加如下代码

      image-20230523220039081 image-20230523220108131
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值