1.生命周期介绍
1.1 活动栈
Android中的活动是可以层叠的每启动一个新的活动,就会覆盖在原活动之上,点击Back键或调用finish()方法会销毁最上面的活动,下面的一个活动就会重新显示
1.2 活动的四种状态
运行状态:处于活动栈的栈顶
暂停状态:不再处于栈顶,但仍然可见
停止状态:不再处于栈顶,且完全不可见
销毁状态:从活动栈中移除
1.3 活动的生存期
onCreate():活动第一次创建的时候调用,完成初始化操作
onStart():由不可见变为可见的时候调用
onResume():活动准备好和用户进行交互的时候调用,此时的活动一定位于返回栈的栈顶
onPause():在系统准备去启动或者恢复另一个活动的时候调用,释放消耗cpu的资源,保存关键数据
onStop():在活动完全不可见的时候调用
onDestroy():在活动被销毁之前调用
onRestart():在活动由停止状态变为运行状态之前调用
完整生存期:onCreate()与onDestroy()之间经历的,在onCreate()完成初始化,在onDestroy()释放内存
可见生存期:onStart()与onStop()之间经历的,活动对于用户总是可见的
前台生存期:onResume()与onPause()之间经历的,活动总是运行状态,与用户交互
2.生命周期流程图
3.程序
3.1.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitylifecycletest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityLifeCycleTest">
<activity
android:name=".normal"
android:exported="false" />
<activity
android:name=".DialogActivity"
android:exported="true"
android:theme="@style/Theme.AppCompat.Dialog"/>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
android:theme="@style/Theme.AppCompat.Dialog"/>
这句程序是将这个Activity定义成对话框的形式
3.2 MainActivity
package com.example.activitylifecycletest
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.activitylifecycletest.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val tag="MainActivity"
private lateinit var binding: ActivityMainBinding //1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(tag,"onCreate")
setContentView(R.layout.activity_main)
val binding=ActivityMainBinding.inflate(layoutInflater)//2
setContentView(binding.root)//3
binding.startNormalActivity.setOnClickListener {
val intent=Intent(this,normal::class.java)
startActivity(intent)
}
binding.startDiglogActivity.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 onDestroy() {
super.onDestroy()
Log.d(tag,"onDestory")
}
override fun onRestart() {
super.onRestart()
Log.d(tag,"onRestart")
}
}
实例结果:
4.Activity被回收数据怎么办
首先先定义一个onSaveInstanceState()接口
//通过调用onSaveInstanceState,将临时数据进行保存,当内存不够时,这个活动界面被杀掉时,会保证在被回收前被调用
//onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,
// 比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据,以此类推。每个保存方法需要传入两个参数,
// 第一个参数是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tempData="这是一个测试数据"
outState.putString("data_key",tempData)
}
然后在onCreate中设置如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(tag,"onCreate")
setContentView(R.layout.activity_main)
//onCreate()方法其实也有一个Bundle类型的参数。这个参数在一般情况下都是null,
// 但是如果在Activity被系统回收之前,你通过onSaveInstanceState()方法保存数据,这个参数就会带有之前保存的全部数据,
// 我们只需要再通过相应的取值方法将数据取出即可。
if (savedInstanceState != null){
val tempData=savedInstanceState.getString("data_key")
}