Android生命周期继续踩坑
- android.overridePathCheck=true“覆盖路径检查” as出现问题 connect time out
![]()
-
在多个窗口中使用 Logcat
标签页可帮助您在不同的设备或查询之间轻松切换。您可以点击 New Tab 图标
创建多个 Logcat 标签页。 右键点击标签页可对其重命名和重新排列。此外,您还可以在标签页中拆分视图,以便更轻松地比较两组日志。如需创建分屏,请右键点击日志视图,或点击工具栏中的 Split Panels 选项,然后选择 Split Right 或 Split Down。如需取消分屏,请右键点击并选择 Close。每个分屏都允许您设置自己的设备连接、视图选项和查询。
图 2. 在 Android Studio Electric Eel 中拆分 Logcat 窗口。在 Logcat 工具栏中,您可以滚动到日志的末尾,也可以点击特定行以使该行保持可见。
-
您可使用
onCreate()方法为 activity 执行所有一次性初始化。例如,在onCreate()中,您可以膨胀布局、定义点击监听器或设置数据绑定。![9be2255ff49e0af8.png]()
系统会在初始化 activity 之后(在内存中创建新的
Activity对象后)立即调用一次onCreate()生命周期方法。执行onCreate()后,相应 activity 会被视为已创建。注意:
onCreate()方法是替换方法。如果您替换了任何生命周期方法,则必须立即调用super.onCreate()。您可使用
onCreate()方法为 activity 执行所有一次性初始化。例如,在onCreate()中,您可以膨胀布局、定义点击监听器或设置数据绑定。![9be2255ff49e0af8.png]()
系统会在初始化 activity 之后(在内存中创建新的
Activity对象后)立即调用一次onCreate()生命周期方法。执行onCreate()后,相应 activity 会被视为已创建。注意:
onCreate()方法是替换方法。如果您替换了任何生命周期方法,则必须立即调用super.onCreate()。 -
Log.i("MainActivity", "onCreate Called")Log类会将消息写入 Logcat。此命令包含三个部分:
- 系统会在调用
onCreate()生命周期方法之后立即调用onStart()。onStart()运行后,您的 activity 会显示在屏幕上。与为初始化 activity 而仅调用一次的onCreate()不同,onStart()可在 activity 的生命周期内多次调用。 ![385df4ce82ae2de9.png]()
- 请注意,
onStart()需要与相应的onStop()生命周期方法配对使用。如果用户启动您的应用后又返回设备的主屏幕,相应 activity 会停止,并且不会再在屏幕上显示。 - 系统会在调用
onCreate()生命周期方法之后立即调用onStart()。onStart()运行后,您的 activity 会显示在屏幕上。与为初始化 activity 而仅调用一次的onCreate()不同,onStart()可在 activity 的生命周期内多次调用。 ![385df4ce82ae2de9.png]()
- 请注意,
onStart()需要与相应的onStop()生命周期方法配对使用。如果用户启动您的应用后又返回设备的主屏幕,相应 activity 会停止,并且不会再在屏幕上显示。 - Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.
- build gradle ext-versoin
![]()
- Invoke-customs are only supported starting with Android O (--min-api 26)]Invoke-customs are only supported starting with Android O (--min-api 26)]
-
当 activity 从头开始启动时,您会看到系统按顺序调用以下三个生命周期回调:
onCreate():用于创建应用。onStart():用于启动相应 activity,并让其在屏幕上显示。onResume():用于使相应 activity 成为焦点,并让用户能够与其互动。
onResume()方法尽管名称是这样,但会在启动时调用,即使没有要恢复的 activity 也是如此。当 activity 从头开始启动时,您会看到系统按顺序调用以下三个生命周期回调:
onCreate():用于创建应用。onStart():用于启动相应 activity,并让其在屏幕上显示。onResume():用于使相应 activity 成为焦点,并让用户能够与其互动。
onResume()方法尽管名称是这样,但会在启动时调用,即使没有要恢复的 activity 也是如此。 -
每次用户离开您的 activity 时,它都不会关闭:
- 当 activity 不再在屏幕上可见时,就说明该 activity 已置于后台(与之相反的是 activity 位于前台或屏幕上)。
- 当用户返回您的应用时,相应 activity 会重启并再次可见。这部分生命周期称为应用的可见生命周期。
当您的应用位于后台时,为保留系统资源和延长电池续航时间,应用不应活跃运行。您可以使用
Activity生命周期及其回调来了解应用何时切换到后台,以便您暂停任何正在进行的操作。然后,在您的应用进入前台时重启这些操作。例如,假设某个应用需要大量使用计算资源。此应用可能会使用设备的 CPU 进行许多计算。移动设备的处理能力和电池续航时间通常受到限制,因此 Android 运行时系统需要均衡资源。由于后台进程可能会降低性能或过早耗尽手机电量,因此 Android 可能会阻止未在前台运行的应用使用资源。
每次用户离开您的 activity 时,它都不会关闭:
- 当 activity 不再在屏幕上可见时,就说明该 activity 已置于后台(与之相反的是 activity 位于前台或屏幕上)。
- 当用户返回您的应用时,相应 activity 会重启并再次可见。这部分生命周期称为应用的可见生命周期。
当您的应用位于后台时,为保留系统资源和延长电池续航时间,应用不应活跃运行。您可以使用
Activity生命周期及其回调来了解应用何时切换到后台,以便您暂停任何正在进行的操作。然后,在您的应用进入前台时重启这些操作。例如,假设某个应用需要大量使用计算资源。此应用可能会使用设备的 CPU 进行许多计算。移动设备的处理能力和电池续航时间通常受到限制,因此 Android 运行时系统需要均衡资源。由于后台进程可能会降低性能或过早耗尽手机电量,因此 Android 可能会阻止未在前台运行的应用使用资源。
- 请注意,系统会调用
onPause()方法和onStop()方法,但不会调用onDestroy()。返回主屏幕的操作会将您的应用置于后台,而不是完全关闭应用。![38710e0d2c4d1910.png]()
在调用
onPause()后,该应用不会再获得焦点。在onStop()之后,该应用将不再显示在屏幕上。虽然该 activity 已停止,但Activity对象仍位于内存中(在后台)。该 activity 尚未销毁。用户可能会返回该应用,因此 Android 会保留您的 activity 资源。![b488b32801220b79.png]()
- 使用“最近”屏幕返回该应用。请注意,在 Logcat 中,该 activity 使用
onRestart()和onStart()重启,然后使用onResume()恢复。
![f6275abeaa53abe4.png]()
当该 activity 返回前台时,系统不会再次调用
onCreate()方法。相应 activity 对象未被销毁,因此不需要重新创建。系统会调用onRestart()方法,而不是onCreate()。请注意,这一次该 activity 返回前台时,系统会保留 Desserts Sold 数值。- 除 DessertClicker 以外,至少启动一个应用,这样设备的“最近使用的应用”屏幕中就会有一些应用。
- 启动“最近使用的应用”屏幕,然后打开另外一个近期 activity。然后,返回最近用过的应用并让 DessertClicker 返回前台。
请注意,您在 Logcat 这里看到的回调与按主屏幕按钮后看到的相同。当应用进入后台时,系统会调用
onPause()和onStop(),并在应用返回时调用onRestart()、onStart()和onResume()。此处的要点是,当用户导航到该 activity 或离开该 activity 时,系统会多次调用
onStart()和onStop()。您应替换这些方法,使应用在进入后台后停止运行,或者在返回前台时重新启动。onRestart()又是什么情况呢?onRestart()方法与onCreate()非常相似。无论是onCreate()还是onRestart(),都会在相应 activity 变得可见之前调用。onCreate()方法只在第一次被调用,之后会调用onRestart()。onRestart()方法用于放置仅在 activity 不是首次启动时才需要调用的代码。- 请注意,系统会调用
onPause()方法和onStop()方法,但不会调用onDestroy()。返回主屏幕的操作会将您的应用置于后台,而不是完全关闭应用。![38710e0d2c4d1910.png]()
在调用
onPause()后,该应用不会再获得焦点。在onStop()之后,该应用将不再显示在屏幕上。虽然该 activity 已停止,但Activity对象仍位于内存中(在后台)。该 activity 尚未销毁。用户可能会返回该应用,因此 Android 会保留您的 activity 资源。![b488b32801220b79.png]()
- 使用“最近”屏幕返回该应用。请注意,在 Logcat 中,该 activity 使用
onRestart()和onStart()重启,然后使用onResume()恢复。
![f6275abeaa53abe4.png]()
当该 activity 返回前台时,系统不会再次调用
onCreate()方法。相应 activity 对象未被销毁,因此不需要重新创建。系统会调用onRestart()方法,而不是onCreate()。请注意,这一次该 activity 返回前台时,系统会保留 Desserts Sold 数值。- 除 DessertClicker 以外,至少启动一个应用,这样设备的“最近使用的应用”屏幕中就会有一些应用。
- 启动“最近使用的应用”屏幕,然后打开另外一个近期 activity。然后,返回最近用过的应用并让 DessertClicker 返回前台。
请注意,您在 Logcat 这里看到的回调与按主屏幕按钮后看到的相同。当应用进入后台时,系统会调用
onPause()和onStop(),并在应用返回时调用onRestart()、onStart()和onResume()。此处的要点是,当用户导航到该 activity 或离开该 activity 时,系统会多次调用
onStart()和onStop()。您应替换这些方法,使应用在进入后台后停止运行,或者在返回前台时重新启动。onRestart()又是什么情况呢?onRestart()方法与onCreate()非常相似。无论是onCreate()还是onRestart(),都会在相应 activity 变得可见之前调用。onCreate()方法只在第一次被调用,之后会调用onRestart()。onRestart()方法用于放置仅在 activity 不是首次启动时才需要调用的代码。- 请注意,系统会调用
- 请注意,系统会调用
onPause()方法和onStop()方法,但不会调用onDestroy()。返回主屏幕的操作会将您的应用置于后台,而不是完全关闭应用。![38710e0d2c4d1910.png]()
在调用
onPause()后,该应用不会再获得焦点。在onStop()之后,该应用将不再显示在屏幕上。虽然该 activity 已停止,但Activity对象仍位于内存中(在后台)。该 activity 尚未销毁。用户可能会返回该应用,因此 Android 会保留您的 activity 资源。![b488b32801220b79.png]()
- 使用“最近”屏幕返回该应用。请注意,在 Logcat 中,该 activity 使用
onRestart()和onStart()重启,然后使用onResume()恢复。
![f6275abeaa53abe4.png]()
当该 activity 返回前台时,系统不会再次调用
onCreate()方法。相应 activity 对象未被销毁,因此不需要重新创建。系统会调用onRestart()方法,而不是onCreate()。请注意,这一次该 activity 返回前台时,系统会保留 Desserts Sold 数值。- 除 DessertClicker 以外,至少启动一个应用,这样设备的“最近使用的应用”屏幕中就会有一些应用。
- 启动“最近使用的应用”屏幕,然后打开另外一个近期 activity。然后,返回最近用过的应用并让 DessertClicker 返回前台。
请注意,您在 Logcat 这里看到的回调与按主屏幕按钮后看到的相同。当应用进入后台时,系统会调用
onPause()和onStop(),并在应用返回时调用onRestart()、onStart()和onResume()。此处的要点是,当用户导航到该 activity 或离开该 activity 时,系统会多次调用
onStart()和onStop()。您应替换这些方法,使应用在进入后台后停止运行,或者在返回前台时重新启动。onRestart()又是什么情况呢?onRestart()方法与onCreate()非常相似。无论是onCreate()还是onRestart(),都会在相应 activity 变得可见之前调用。onCreate()方法只在第一次被调用,之后会调用onRestart()。onRestart()方法用于放置仅在 activity 不是首次启动时才需要调用的代码。- 请注意,系统会调用
-
共享 activity 出现在屏幕的下半部分,但相应 activity 在上半部分仍然可见。
- 检查 Logcat,您会注意到,系统仅调用了
onPause()。![cf96ef14999a9a3c.png]()
在此用例中,系统没有调用
onStop(),因为相应 activity 仍然部分可见。但是,该 activity 没有用户焦点,并且用户无法与之交互。位于前台的“分享”activity 具有用户焦点。为什么这种区别至关重要?以之前的计算密集型应用为例。您可能希望该应用在转入后台后停止运行,但在其被部分遮挡时继续运行。在这种情况下,您可以在
onStop()中终止它。如果您希望该应用在相应 activity 被部分遮挡时也停止运行,则需要在onPause()中放置用于终止应用的代码。在
onPause()中运行的任何代码都会阻止其他内容显示,因此请使onPause()中的代码保持轻量级。例如,当有来电时,onPause()中的代码可能会延迟来电通知。- 在共享对话框之外点击一下,返回应用,您会注意到系统调用了
onResume()。
onResume()和onPause()都必须处理焦点。当相应 activity 具有焦点时,系统会调用onResume()方法;当该 activity 失去焦点时,系统会调用onPause()。 - 检查 Logcat,您会注意到,系统仅调用了
-
在更复杂的 Android 应用中,您可能会在
onStart()或onCreate()中设置许多内容,然后在onStop()或onDestroy()中将其全部拆解。例如,您可能有动画、音乐、传感器或计时器需要设置和拆解以及启动和停止。如果您忘记了一个,就会导致 bug 和麻烦。生命周期库(它是 Android Jetpack 的一部分)可以简化此任务。当您必须跟踪许多可动部分而其中某些部分处于不同的生命周期状态时,该库特别有用。该库反转了生命周期的工作方式:通常,activity 或 fragment 会告知组件(如
DessertTimer)在发生生命周期回调时要执行什么操作。但是,当您使用生命周期库时,组件本身会观察生命周期的变化,然后在发生这些变化时执行所需的操作。生命周期库有三个主要部分:
- 生命周期所有者 - 具有(和“拥有”)生命周期的组件。
Activity和Fragment就是生命周期所有者。生命周期所有者会实现LifecycleOwner接口。 Lifecycle类 - 保存生命周期所有者的实际状态,并在生命周期发生变化时触发事件。- 生命周期观察器 - 观察生命周期状态,并在生命周期发生变化时执行任务。生命周期观察器会实现
LifecycleObserver接口。
- 生命周期所有者 - 具有(和“拥有”)生命周期的组件。
-
生命周期库的一个关键部分是生命周期观察的概念。观察可让类(如
DessertTimer)了解 activity 或 fragment 生命周期,并启动和停止它们自己来响应这些生命周期状态的变化。借助生命周期观察器,您可以让 activity 和 fragment 方法摆脱启动和停止对象的责任。- 打开
DesertTimer.kt类。 - 将
DessertTimer类的类签名更改为如下所示:
class DessertTimer(lifecycle: Lifecycle) : LifecycleObserver {这一新类定义起到两个作用:
- 构造函数接受一个
Lifecycle对象,该对象是计时器观察的生命周期。 - 该类定义会实现
LifecycleObserver接口。
- 在
DessertTimer类中runnable变量的声明下面,向该类定义中添加一个init代码块。在init代码块中,使用addObserver()方法将从所有者(即 activity)传入的生命周期对象连接到此类(即观察器)。
- 打开

创建多个 Logcat 标签页。 右键点击标签页可对其重命名和重新排列。
图 2. 在 Android Studio Electric Eel 中拆分 Logcat 窗口。






浙公网安备 33010602011771号