安卓开发学习笔记_Activity_Activity的生命周期
返回栈
Activity状态
Activity的生存期
体验Activity的生命周期
新建一个ActivityLifeCycleTest项目, 再创建两个子Activity——NormalActivity和DialogActivity.
编辑normal_layout.xml
文件, 代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a normal activity"
/>
</LinearLayout>
TextView用于显示一行文字
编辑dialog_layout.xml
文件, 代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a dialog activity"
/>
</LinearLayout>
在AndroidMainfest.xml
中将DialogActivity设置为对话框式, 代码如下:
<activity
android:name=".DialogActivity"
android:theme = "@style/Theme.AppCompat.Dialog"
android:exported="false" />
<activity
android:name=".NormalActivity"
android:exported="false" />
android:theme
用于给当前Activity指定主题
修改activity_main.xml
, 代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/startNormalActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start NormalActivity" />
<Button
android:id="@+id/startDialogActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start DialogActivity" />
</LinearLayout>
修改MainActivity, 代码如下:
class MainActivity : AppCompatActivity() {
private val tag = "MainActivity"
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(tag, "onCreate")
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.startNormalActivity.setOnClickListener {
val intent = Intent(this, NormalActivity::class.java)
startActivity(intent)
}
binding.startDialogActivity.setOnClickListener {
val intent = Intent(this, DialogActivity::class.java)
startActivity(intent)
}
}
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")
}
}
启动程序后
当MainActivity第一次被创建时会依次执行onCreate()、onStart()和onResume()方法
启动NormalActivity后
由于NormalActivity已经把MainActivity完全遮挡住,因此onPause()和onStop()方法都会得到执行
点击Back键返回MainActivity后
由于之前MainActivity已经进入了停止状态, 所以onRestart()方法会得到执行, 之后会依次执行onStart()和onResume()方法. 注意, 此时onCreate()方法不会执行, 因为MainActivity并没有重新创建.
启动DialogActivity后
只有onPause()方法得到了执行, onStop()方法并没有执行, 这是因为DialogActivity并没有完全遮挡住MainActivity, 此时MainActivity只是进入了暂停状态, 并没有进入停止状态.
点击Back键返回MainActivity后
只有onResume()方法会得到执行
退出MainActivity后
依次会执行onPause(), onStop()和onDestroy()方法,最终销毁MainActivity.
Activity被回收了怎么办
onSaveInstanceState()回调方法在Activity被回收之前一定会被调用, 可以用来保存数据.
// 数据保存在Bundle中
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tempData = "Something you just typed"
outState.putString("data_key", tempData)
}
对应的取值操作, 代码如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(tag, "onCreate")
setContentView(R.layout.activity_main)
if (savedInstanceState != null) {
val tempData = savedInstanceState.getString("data_key")
Log.d(tag, "tempData is $tempData")
}
...
}
传递数据也可以先将数据保存在Bundle对象中, 然后将Bundle对象存放在Intent中. 到了目标Activity后, 先从Intent中取出Bundle, 再从Bundle中取出数据