深入探索 Android 生命周期与 Java 基础

1. Android 生命周期方法剖析

在 Android 开发中,系统会在不同时刻调用我们编写的方法。使用 @Override 关键字可以重写 Android API 提供的原始方法。若不重写,系统将调用原始版本。而在重写方法里, super.on... 代码会调用原始版本,这意味着我们不仅添加了自己的代码,也执行了原始方法的代码。

以下是重写方法的关键信息:
| 方法 | 作用 |
| ---- | ---- |
| onCreate | 应用启动时调用,可在此进行应用的初始化设置 |
| onStart | 应用可见时调用 |
| onResume | 应用获得焦点可交互时调用,可在此加载用户数据 |
| onPause | 应用失去焦点时调用,需在此保存用户数据 |
| onStop | 应用不可见时调用 |
| onDestroy | 应用销毁时调用,可进行资源清理 |

2. 运行生命周期演示应用

通过运行生命周期演示应用,我们能更直观地了解 Android 生命周期。具体操作步骤如下:
1. 在设备或模拟器上运行应用。
2. 观察模拟器屏幕,会依次出现 In onCreate In onStart In onResume 的 Toast 消息。
3. 在 Logcat 窗口查看相应的日志信息,若消息过多,可将日志级别设置为 Info 进行过滤。
4. 点击模拟器或设备的返回按钮,会依次出现 In onPause In onStop In onDestroy 的 Toast 消息,并在 Logcat 窗口验证输出。
5. 点击模拟器/设备屏幕上的其他应用图标,运行另一个应用。
6. 打开模拟器的任务管理器(若不确定操作方法,可参考相关说明)。
7. 此时会显示设备上最近运行的所有应用。
8. 点击生命周期演示应用,会显示通常的三个启动消息,因为应用之前已被销毁。
9. 再次点击任务管理器按钮,切换到另一个应用,此时只会显示 In onPause In onStop 消息,应用未被销毁。
10. 再次使用任务管理器按钮切换回生命周期演示应用,只会显示 In onStart In onResume 消息,说明无需调用 onCreate 方法即可重新启动应用,因为应用之前只是被停止。

graph LR
    A[运行应用] --> B[显示 onCreate、onStart、onResume 消息]
    B --> C[点击返回按钮]
    C --> D[显示 onPause、onStop、onDestroy 消息]
    D --> E[运行其他应用]
    E --> F[打开任务管理器]
    F --> G[切换到生命周期演示应用]
    G --> H[显示 onCreate、onStart、onResume 消息]
    H --> I[切换到其他应用]
    I --> J[显示 onPause、onStop 消息]
    J --> K[切换回生命周期演示应用]
    K --> L[显示 onStart、onResume 消息]
3. 生命周期演示应用输出分析

首次启动生命周期演示应用时, onCreate onStart onResume 方法会被调用;使用返回按钮关闭应用时, onPause onStop onDestroy 方法会被调用。由于在重写方法中使用了 super.on... 代码,原始版本的方法也会被调用。

当使用任务管理器在应用间切换时,生命周期演示应用在切换出去时未被销毁,切换回来时无需运行 onCreate 方法。

4. Toast 消息的显示情况

应用启动和关闭时的三个 Toast 消息是排队显示的,在消息显示时,相应方法已执行完毕。可以通过再次运行实验验证,三个启动/关闭日志消息会在第二个 Toast 消息显示之前输出。Toast 消息虽不能体现方法执行的时间,但能强化我们对方法调用顺序的认识。

5. 应对复杂的生命周期情况

由于 Android 设备和用户交互的多样性,系统调用生命周期方法的时间难以预测。例如,用户按主页按钮退出应用、使用返回按钮切换应用、系统销毁后台应用等情况。不过,我们可以遵循以下简单规则来应对:
- 在 onCreate 方法中进行应用的初始化设置。
- 在 onResume 方法中加载用户数据。
- 在 onPause 方法中保存用户数据。
- 在 onDestroy 方法中进行资源清理。
- 留意 onStart onStop 方法的使用场景。

遵循这些规则,我们就能让 Android 系统处理生命周期相关的复杂情况。

6. 其他重写方法

在使用 Basic Activity 模板创建的项目代码中,还有两个自动生成的方法: onCreateOptionsMenu onOptionsItemSelected 。大多数 Android 应用都有弹出菜单,Android Studio 会默认生成相关代码。

onCreateOptionsMenu 方法用于从 menu_main.xml 文件加载菜单,代码如下:

getMenuInflater().inflate(R.menu.menu_main, menu);

该方法由 onCreate 方法的默认版本调用。在后续章节中,我们会使用弹出菜单在应用的不同屏幕间切换。

onOptionsItemSelected 方法在用户点击菜单按钮时调用,用于处理菜单项的选择事件。目前该方法只是返回 true ,可添加 Toast 和 Log 消息来测试调用顺序和时间。

7. Java 代码结构回顾

每次创建新的 Android 项目时,会同时创建一个新的 Java 包来存放代码。我们已经学习并使用了类,从 Android API 导入并使用了 Log Toast 等类,还使用了 AppCompatActivity 类。通过 extends 关键字,我们可以基于 AppCompatActivity 类创建新的类,如 MainActivity

AppCompatActivity Activity 的改进版本,为旧版本 Android 提供额外功能。只要类名以 ...Activity 结尾,之前讨论的关于 Activity 的内容都适用。

在 Java 中,类是代码的基础,我们可以导入类、扩展类,最终创建自己的类。类中的方法封装了实现具体功能的代码。

8. Java 基础学习准备

了解 Android 生命周期和可重写的方法后,我们需要学习 Java 基础知识,以便在这些方法中编写代码。接下来,我们将学习 Java 变量、运算符和表达式等核心内容。

9. Java 变量、运算符和表达式

在接下来的章节中,我们将学习和实践 Java 数据的核心基础知识,包括数据的创建、理解以及操作和响应。同时,会快速回顾之前学过的 Java 知识,并深入学习如何编写自己的 Java 代码。这些原则不仅适用于 Java,也适用于其他编程语言。

10. Java 的广泛应用

我们即将学习的 Java 核心基础知识,既适用于继承而来的类(如 Activity / AppCompatActivity ),也适用于我们自己编写的类。在后续章节中,我们会使用 AppCompatActivity 类进行大量的 Java 代码练习,通过 Log Toast 查看代码执行结果,还会使用自定义方法和重写的 Activity 类方法触发代码执行。

Java 代码的应用场景非常广泛,以下是一些示例:
| 应用场景 | 说明 |
| ---- | ---- |
| 桌面操作系统 | 可在主流桌面操作系统上运行 |
| 现代电视 | 许多现代电视支持 Java 应用 |
| 卫星导航系统 | 可用于卫星导航系统的开发 |
| 智能冰箱 | 智能冰箱等设备也可使用 Java 代码 |

11. Java 语法和术语

在学习过程中,我们会用通俗易懂的语言讨论技术问题,但也会引入 Java 和 Android 社区常用的技术术语。Java 语法是将 Java 语言元素组合成能在 Dalvik 虚拟机中运行的代码的方式,这些语言元素被称为关键字。

学习 Java 的关键不在于知道多少关键字,而在于如何熟练运用它们。编程既是一门科学,也是一门艺术,需要通过实践和深入学习来掌握。

12. 代码注释

随着 Java 程序变得复杂,代码注释变得尤为重要。代码注释不会影响程序的执行,编译器会忽略它们,但能帮助程序员记录、解释和澄清代码,便于自己后续理解或其他程序员使用和修改。

Java 中有两种类型的代码注释:
- 单行注释:以 // 开头,注释内容到行尾结束。例如:

// this is a comment explaining what is going on
  • 多行注释:以 /* 开头,以 */ 结尾,可跨越多行。例如:
/*
   You can tell I am good at this because my
   code has so many helpful comments in it.
*/

单行注释还可用于临时禁用一行代码,只需在代码前添加 // 即可。多行注释则常用于较长的注释或在代码文件顶部添加版权信息等。

通过学习 Android 生命周期和 Java 基础知识,我们为编写更复杂的 Android 应用奠定了坚实的基础。后续我们将继续深入学习 Java 方法、面向对象编程等内容,不断提升编程能力。

13. 变量:Java 数据的基石

在 Java 中,变量是存储数据的容器。要使用变量,首先需要声明它,即指定变量的类型和名称。例如:

int age; // 声明一个整型变量 age

上述代码声明了一个名为 age 的整型变量。接下来,可以为变量赋值:

age = 25; // 为变量 age 赋值为 25

也可以在声明变量的同时进行赋值:

int score = 90; // 声明并初始化一个整型变量 score

Java 中有多种数据类型,常见的基本数据类型如下表所示:
| 数据类型 | 说明 | 示例 |
| ---- | ---- | ---- |
| int | 整型,用于存储整数 | int number = 10; |
| double | 双精度浮点型,用于存储小数 | double price = 9.99; |
| char | 字符型,用于存储单个字符 | char grade = 'A'; |
| boolean | 布尔型,用于存储 true false | boolean isStudent = true; |

14. 运算符:操作数据的工具

运算符用于对变量和值进行操作。Java 中的运算符可以分为以下几类:
- 算术运算符 :用于执行基本的数学运算,如加( + )、减( - )、乘( * )、除( / )和取模( % )。示例代码如下:

int a = 10;
int b = 3;
int sum = a + b; // 加法运算,结果为 13
int difference = a - b; // 减法运算,结果为 7
int product = a * b; // 乘法运算,结果为 30
int quotient = a / b; // 除法运算,结果为 3
int remainder = a % b; // 取模运算,结果为 1
  • 赋值运算符 :用于为变量赋值,如 = += -= 等。示例代码如下:
int x = 5;
x += 3; // 等价于 x = x + 3,结果 x 为 8
  • 比较运算符 :用于比较两个值的大小关系,返回布尔值,如 > < == 等。示例代码如下:
int m = 10;
int n = 20;
boolean result = m < n; // 比较 m 是否小于 n,结果为 true
  • 逻辑运算符 :用于组合布尔表达式,如 && (逻辑与)、 || (逻辑或)、 ! (逻辑非)。示例代码如下:
boolean p = true;
boolean q = false;
boolean andResult = p && q; // 逻辑与运算,结果为 false
boolean orResult = p || q; // 逻辑或运算,结果为 true
boolean notResult =!p; // 逻辑非运算,结果为 false
15. 表达式:组合变量和运算符

表达式是由变量、常量、运算符和方法调用组成的式子,用于计算值。例如:

int x = 5;
int y = 3;
int result = x + y * 2; // 表达式 x + y * 2 的计算结果为 11

在计算表达式时,需要遵循运算符的优先级。例如,乘法和除法的优先级高于加法和减法。可以使用括号来改变运算的顺序,例如:

int result = (x + y) * 2; // 先计算括号内的加法,结果为 16
16. Java 代码实践流程

为了更好地掌握 Java 变量、运算符和表达式,我们可以按照以下流程进行实践:

graph LR
    A[创建 Android 项目] --> B[在 Activity 类中编写 Java 代码]
    B --> C[使用 Log 和 Toast 输出结果]
    C --> D[运行应用查看结果]
    D --> E[分析结果并优化代码]

具体步骤如下:
1. 创建一个新的 Android 项目,选择合适的模板。
2. 在 MainActivity 类中编写 Java 代码,使用变量、运算符和表达式进行计算。
3. 使用 Log Toast 输出计算结果,方便调试和查看。例如:

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int num1 = 10;
        int num2 = 5;
        int sum = num1 + num2;

        Log.i("MainActivity", "两数之和为: " + sum);
        Toast.makeText(this, "两数之和为: " + sum, Toast.LENGTH_SHORT).show();
    }
}
  1. 运行应用,在 Logcat 窗口查看 Log 输出,在屏幕上查看 Toast 消息。
  2. 分析输出结果,检查代码是否符合预期。如果有问题,对代码进行优化和修改。
17. 总结与展望

通过学习 Android 生命周期和 Java 基础知识,我们了解了 Android 系统如何调用生命周期方法,以及如何重写这些方法来实现特定的功能。同时,我们学习了 Java 变量、运算符和表达式的基本概念和使用方法,为编写更复杂的 Java 代码奠定了基础。

在后续的学习中,我们将深入学习 Java 方法、面向对象编程等内容,进一步提升我们的编程能力,开发出更强大、更实用的 Android 应用。希望大家通过不断的实践和学习,能够熟练掌握这些知识,成为优秀的 Android 开发者。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐