Android活动生命周期– 7个阶段和功能
活动是Android应用程序的主要组件之一。
在本教程中,我们将研究android活动的生命周期,以及在活动运行时的不同阶段调用的各种功能。
Android活动生命周期流程图
活动是用户可以看到的唯一关注的事物。
让我们通过流程图了解活动的生命周期,何时以及为什么触发哪些功能。
Android活动生命周期阶段
android活动将经历以下生命周期阶段。
- 创建
- 开始
- 暂停
- 恢复
- 停止
- 重新开始
- 销毁
每个生命周期阶段都有特定的回调函数。
Android活动生命周期功能
让我们看一下一项活动的生活方式功能。
1. onCreate()
这是活动生命周期的第一阶段。
活动初始化时将调用此函数。
在我们的Kotlin Activity类中,以下函数定义onCreate()
:
fun onCreate(savedInstanceState: Bundle?)
我们将在后面的部分中查看捆绑销售商品值。
2. onStart()
在此生命周期阶段,活动已准备就绪。
当活动进入前台但尚未交互时,将调用此函数。
3. onResume()
这是活动执行的地方。
当用户与活动进行交互时,将调用此函数。
4. onPause()
当用户无法与活动进行互动时,会调用此函数。
常见情况:出现来电。
弹出另一个应用程序。
引入Android N和多窗口功能后,一次可在屏幕上看到多个应用程序。
没有重点关注的应用将触发onPause()方法。
5. onStop()
当活动不再可见并且已停止工作时,将触发此功能。
6. onDestroy()
活动销毁时将触发此函数。
常见方案:新活动开始,当前活动被终止。
例如,按返回按钮退出应用程序。
7. onRestart()
停止活动后,只要活动开始,就会触发此功能。
它与onstart()的不同之处在于,在活动首次启动时不会调用它。
在后面的阶段,它总是在onStart()之前调用。
保存和还原活动状态
Android为我们提供了一对函数:onSaveInstanceState()和onRestoreInstanceState()。
以下是保存活动状态的主要情况。
当
onStop()
被触发时。在配置更改(例如屏幕旋转)时,屏幕尺寸也会更改。
Android N具有多窗口功能,因此用户经常更改应用程序的窗口大小。
配置更改通常会通过破坏当前视图以再次绘制来触发应用程序以重新创建当前活动。
我们需要将活动的当前状态保存在ʻonSaveInstanceState()函数中,如下所示。
override fun onSaveInstanceState(outState: Bundle?) { super.onSaveInstanceState(outState) }
Bundle对象以键/值对的形式存储活动中的字段值。
由于Kotlin,Bundle对象的类型可以为null,以防止NullPointerException。
override fun onRestoreInstanceState(savedInstanceState: Bundle?) { super.onRestoreInstanceState(savedInstanceState) }
仅当存在保存状态时才调用onRestoreInstanceState()函数。
注意:Android会自动负责保存和还原具有唯一ID的视图。
因此,在下面的布局中,将仅保存和还原TextView的值。
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="net.androidly.helloworldkotlin.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CLICK ME" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" </android.support.constraint.ConstraintLayout>
要禁用保存视图状态,请将属性android:saveEnabled设置为假。
对于自定义视图,我们需要在小部件上显式设置setSavedEnabled(true)
。
以下代码段演示了活动中的保存和恢复状态。
import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { var title = "This title variable would reset when the configuration is changed. Let's preserve it" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView.setText(title) } override fun onSaveInstanceState(outState: Bundle?) { outState?.putString("title",title) super.onSaveInstanceState(outState) } override fun onRestoreInstanceState(savedInstanceState: Bundle?) { textView.setText(savedInstanceState?.getString("title")) super.onRestoreInstanceState(savedInstanceState) } }
onRestoreInstanceState()函数仅在被Android OS杀死活动后重新创建活动时调用。
注意:或者,也可以在onCreate函数中检索保存的实例值。
但是我们必须保留一个null检查器,因为在首次创建活动时,bundle对象将为null。
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState != null) { textView.setText(savedInstanceState.getString("title")) } else textView.setText(title) }
处理活动配置更改
我们可以在AndroidManifest.xml文件中设置android:configChanges属性,以防止在配置更改时重新创建活动。
<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name">
每当上述任何配置更改发生时,都会触发以下方法。
override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) }