Activity的生命周期-android-kotlin

各种回调方法

回调方法 调用期
onCreate() 在Activity第一次被创建时调用
onStart() 在Activity有不可见变为可见时调用
onResume() 当Activity位于栈顶并准备好进行交互时调用
onPause() 在启动或恢复另一个Activity时被调用
onStop() 在onPause()之后,在Activity完全不可见时调用。Dialog不会触发此回调。
onDestroy() 在Activity被销毁之前调用,调用后就销毁Activity
onRestart() Activity由停止变为运行之前调用

比如说我们有三个Activity

MainActivity是主界面,有两个按钮,用来跳转到DialogActivityNormalActivity
DialogActivity是一个对话框主题的Activity
NormalActivity就是一个平平无奇的Activity

图示如下:

先上结论

(按执行顺序排序,以MainActivity内的回调方法为例)

  • 启动MainActivity时
    • onCreate()
    • onStart()
    • onResume()
  • MainActivity -> NormalActivity
    • onPause()
    • onStop()
  • 返回MainActivity
    • onRestart()
    • onStart()
    • onResume()
  • MainActivity -> DialogActivity
    • onPause()
  • 返回MainActivity
    • onResume()

再用实例论证一下上述结论

MainActivity创建两个按钮,修改其布局文件:

<LinearLayout
    android:orientation="vertical"
    tools:ignore="MissingConstraints"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <Button
        android:id="@+id/normalButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/start_normalactivity"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/dialogButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/start_dialogactivity"
        tools:ignore="MissingConstraints" />
</LinearLayout>

再为这两个按钮添加跳转功能

dialogButton.setOnClickListener{
    val intent = Intent(this,DialogActivity::class.java)
    startActivity(intent)
}
normalButton.setOnClickListener{
    val intent = Intent(this,NormalActivity::class.java)
    startActivity(intent)
}

DialogActivityNormalActivity现在还都是Empty Activity。
因此,修改DialogActivity的主题配置,用于区分两者。
修改项目的配置文件AndroidManifest.xml

<activity
    android:name=".DialogActivity"
    android:theme="@style/Theme.AppCompat.Dialog" /><!--指定Activity主题为Dialog-->
<activity android:name=".NormalActivity" />

最后,为了能够在Logcat中看到回调信息,我们需要重写文章开头列举的几个方法
修改MainActivity

private val tag = "MainActivity"

override fun onStart() {
    super.onStart()
    Log.d(tag,"onStart")
}

override fun onResume() {
    super.onResume()
    Log.d(tag,"onResume")
}

override fun onPause() {
    super.onPause()
    Log.d(tag,"onPause")
}

override fun onStop() {
    super.onStop()
    Log.d(tag,"onStop")
}

override fun onDestroy() {
    super.onDestroy()
    Log.d(tag,"onDestroy")
}

override fun onRestart() {
    super.onRestart()
    Log.d(tag,"onRestart")
}

大功告成!
Logcat中就可以查看打印信息了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章