先决条件: Android中的活动生命周期
众所周知,每个Android应用程序至少都有一个与其相关联的活动。当应用程序开始执行并运行时,活动将经历各种状态变化。某些事件由用户触发,某些系统触发,这些事件可能导致活动从一种状态转换为另一种状态。与活动相关的所有状态更改都是android中活动生命周期的一部分。当发生某个事件时,每个活动都必须经历Android生命周期的不同阶段。通过维护活动堆栈来管理活动状态,新堆栈位于堆栈的顶部,新活动位于堆栈的顶部,其余活动按放入堆栈的时间顺序位于堆栈的下方。
想象一下3个活动,一个活动处于运行状态,第二个活动被最小化并在后台运行,第三个活动也在后台运行,但是比第二个活动更早地从前台转到后台。因此,这里的第一个活动将在堆栈的顶部,第三个活动将在堆栈的底部,第二个活动将在堆栈的中间。
活动生命周期有七个状态,在这七个状态中,可以确保根据所发生的事件,活动将处于七个状态中的任何一个。
- onCreate()
- onStart()
- onRestart()
- onResume()
- onPause()
- onStop()
- onDestroy()
要了解有关此活动状态的工作方式以及该活动在每种状态下发生的变化的详细信息,请参阅android中有关活动生命周期的文章。
导致配置更改/状态更改的事件
有许多事件可能导致应用程序的配置更改,最终导致活动的状态更改。让我们看看活动状态发生变化的一些事件和情况。
1.更改应用程序的方向
假设用户正在以纵向模式查看应用程序,然后突然用户将应用程序的方向更改为横向模式。由于更改应用程序的方向最终将改变视图,这将导致应用程序中的配置更改,并且与纵向模式关联的活动被破坏,并且与横向模式关联的新活动被创建。与纵向模式相关联的运行/活动活动将触发onPause() , onStop()和onDestroy()回调。当用户更改方向时,将创建新活动,并且新活动将触发onCreate() , onStart()和onResume()回调。
以下是示例视频,其中,当应用程序的方向发生变化时,您可以看到它所经历的活动状态的变化。请参阅Toast消息以查看活动状态更改。
2.在多窗口屏幕中的应用程序之间切换
众所周知,android已针对API级别为24或更高的应用程序为Android 7启动了多窗口功能,因此,当android应用程序的任何配置发生更改时,android系统都会通知此类事件并更改该事件的生命周期状态。根据应用程序配置已更改的条件进行活动。更改应用程序配置的常见示例是用户调整一个活动相对于另一个活动的大小。您的活动可以处理配置以进行更改,也可以允许系统销毁该活动并使用新维度重新创建。
在多窗口模式下,尽管用户可以看到两个应用程序,但是只有一个与用户进行交互的应用程序位于前台,并且焦点位于onResume()状态,而另一个应用程序处于背景和用户可见的状态为“已暂停”。因此可以说,与用户交互的活动是唯一处于恢复状态的活动,而所有其他活动都已开始但未恢复。当用户从一个应用切换到另一个应用时,系统会在运行中的应用上调用onPause()生命周期状态,并在先前未处于活动状态的另一个应用上调用onResume()生命周期状态。每次用户在应用程序之间切换时,都会在这两种方法之间切换。请参阅Toast消息以查看活动状态更改。
可以看出,当同时运行多个屏幕时,每当用户相对于另一个屏幕调整一个屏幕的大小时,原始活动都会被销毁,并且对应于新的屏幕大小会创建新的活动
3.活动或对话框出现在前台
让我们假设一个活动正在运行并且正在进行中,但是同时,一个新的活动出现在前台,并且部分覆盖了进行中的活动,并通过运行来获取焦点并使运行中的活动进入“暂停”状态。在正在运行的活动上调用onPause() ,新活动进入onResume()状态。当覆盖的活动返回到前台并重新获得焦点时,它将调用onResume() ,而运行中的活动再次进入onPause()状态。
如果新的活动或对话框出现在前景中,则将焦点对准并完全覆盖进行中的活动,则所覆盖的活动将失去焦点并进入“已停止”状态。然后,Android操作系统立即连续依次调用onPause()和onStop()。当涵盖活动的相同实例回到前台时,系统会在活动上调用onRestart() , onStart()和onResume() 。如果它是后台涉及的活动的新实例,则系统不会调用onRestart() ,而只会调用onStart()和onResume() 。请参阅Toast消息以查看活动状态更改。
在上面的视频中,该活动完全覆盖了另一个活动,因此可以观察到状态变化。
4.用户点击“后退”按钮
如果活动处于前台并且处于运行状态,并且用户单击“后退”按钮,则该活动将通过onPause() , onStop()和onDestroy()回调进行转换。除了被销毁之外,该活动还删除了堆栈,该堆栈用于按放入堆栈中的时间顺序存储活动。重要的是要注意,默认情况下,在这种情况下不会调用onSaveInstanceState()回调,因为假定用户轻按了Back按钮,而没有期望返回到活动的相同实例,因此不需要保存活动实例。如果用户重写onBackPressed()方法,仍然强烈建议用户从覆盖的方法中调用super.onBackPressed() ,否则,如果未调用super.onBackPressed(),则可能导致应用程序行为模糊并可能导致不良的用户体验。请参阅Toast消息以查看活动状态更改。