15、深入探索 Android 生命周期与 Java 基础
深入探索 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();
}
}
- 运行应用,在 Logcat 窗口查看
Log输出,在屏幕上查看Toast消息。 - 分析输出结果,检查代码是否符合预期。如果有问题,对代码进行优化和修改。
17. 总结与展望
通过学习 Android 生命周期和 Java 基础知识,我们了解了 Android 系统如何调用生命周期方法,以及如何重写这些方法来实现特定的功能。同时,我们学习了 Java 变量、运算符和表达式的基本概念和使用方法,为编写更复杂的 Java 代码奠定了基础。
在后续的学习中,我们将深入学习 Java 方法、面向对象编程等内容,进一步提升我们的编程能力,开发出更强大、更实用的 Android 应用。希望大家通过不断的实践和学习,能够熟练掌握这些知识,成为优秀的 Android 开发者。
更多推荐
所有评论(0)