Android非異常情況下的Activity生命周期分析
Activity非異常情況下的生命周期是指,用戶正常參與UI交互的情況下,Activity所經(jīng)過(guò)的生命周期的改變;一般情況下,Activity會(huì)經(jīng)過(guò)以下幾個(gè)生命周期。
1、OnCreate(): 表示Activity正在創(chuàng)建,這個(gè)是生命周期的第一個(gè)方法,該方法只調(diào)用一次,在這個(gè)方法中,一般做變量初始化的操作,例如綁定一個(gè)Button控件的Id等。
2、onRestart(): 表示Activity正在重新啟動(dòng),一般情況下,如果最前面的Activity從不可見(jiàn)狀態(tài)變?yōu)榭梢?jiàn)狀態(tài)時(shí),onRestart()這個(gè)方法都會(huì)被調(diào)用,一般情況下都是用戶操作導(dǎo)致的;例如,當(dāng)前這個(gè)Activity叫A,用戶啟動(dòng)了一個(gè)新的Activity叫B,這時(shí)A就會(huì)暫停,也就是onPause()和 onStop()被調(diào)用了,接著用戶又回到了這個(gè)A時(shí),就會(huì)出現(xiàn)這種情況。
3、onStart(): 表示Activity正在被啟動(dòng),將要開(kāi)始,這時(shí)的Activity是可見(jiàn)狀態(tài)了,但是沒(méi)有出呈現(xiàn)到前臺(tái)的,還不能和用戶打交道,其實(shí)Activity已經(jīng)顯示出來(lái)了,只是我們看不到而已
4、onResume(): 表示Activity已經(jīng)可見(jiàn)了,也就是呈現(xiàn)在前臺(tái)上,即我們?nèi)庋勰軌蚩吹靡?jiàn)了。我們要留意這個(gè)onResume()和onStart()的區(qū)別,onStart()和onResume()都表示是Activity的可見(jiàn)狀態(tài),但是調(diào)用onStart()方法時(shí)Activity是在后臺(tái),而調(diào)用onResume()方法時(shí)Activity是在前臺(tái)的。
5、onPause(): 表示Activity正在停止,這時(shí)候Activity的狀態(tài)是不可見(jiàn)的,但是還是顯示在前臺(tái)的;一般情況下,下一個(gè)生命周期的方法onStop()就會(huì)被調(diào)用。在這里可以做一些存儲(chǔ)數(shù)據(jù)的操作,但不可以過(guò)于耗時(shí),因?yàn)闀?huì)影響Activity顯示的效果。
6、onStop(): 表示Activity即將停止,這時(shí)候Activity的狀態(tài)是不可見(jiàn)的,也不是顯示在前臺(tái)上了,在這里可以做一些稍微重量級(jí)的回收工作,也不可以太耗時(shí)。
7、onDestroy(): 表示Activity即將被銷毀,這是Activity生命周期的最后一個(gè)方法,在這里可以做一些資源的釋放。
下面以一張圖展示非異常情況下生命周期調(diào)用的方法

好了,前面分析了那么多,我們來(lái)寫一個(gè)小demo看一下效果。
(1)、首先創(chuàng)建第一個(gè)Activity,名叫ActivityA,代碼如下所示:
var activityName: String? = "ActivityA"
val TAG: String? = "Activity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_a)
Log.d(TAG,activityName + "---------onCreate")
}
override fun onRestart() {
super.onRestart()
Log.d(TAG,activityName + "---------onRestart")
}
override fun onStart() {
super.onStart()
Log.d(TAG,activityName + "---------onStart")
}
override fun onResume() {
super.onResume()
Log.d(TAG,activityName + "---------onResume")
}
override fun onPause() {
super.onPause()
Log.d(TAG,activityName + "---------onPause")
}
override fun onStop() {
super.onStop()
Log.d(TAG,activityName + "---------onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG,activityName + "---------onDestroy")
}
public fun onClick(v: View) {
var clazz = ActivityB:: class.java
var it: Intent = Intent(this,clazz)
startActivity(it)
}
對(duì)應(yīng)的ActivityA的activity_a.xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:gravity="center"
android:text="這是一個(gè)Activity,名字叫A"
android:layout_height="wrap_content" />
<Button
android:layout_width="match_parent"
android:text="點(diǎn)擊此按鈕,可啟動(dòng)新的Activity"
android:onClick="onClick"
android:layout_height="wrap_content" />
</LinearLayout>
(2)、創(chuàng)建另外一個(gè)Activity,名叫ActivityB,如下所示:
val TAG: String? = "Activity"
var activityName: String? = "ActivityB"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_b)
Log.d(TAG,activityName + "---------onCreate")
}
override fun onRestart() {
super.onRestart()
Log.d(TAG,activityName + "---------onRestart")
}
override fun onStart() {
super.onStart()
Log.d(TAG,activityName + "---------onStart")
}
override fun onResume() {
super.onResume()
Log.d(TAG,activityName + "---------onResume")
}
override fun onPause() {
super.onPause()
Log.d(TAG,activityName + "---------onPause")
}
override fun onStop() {
super.onStop()
Log.d(TAG,activityName + "---------onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG,activityName + "---------onDestroy")
}
ActivityB對(duì)應(yīng)的activity_b.xml的文件如下所示~~
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:text="這是一個(gè)Activity,名字叫B" android:gravity="center" android:layout_height="wrap_content" /> </LinearLayout>
第一次運(yùn)行的結(jié)果如下所示~~~~

以下是相應(yīng)的日志打印
01-08 11:48:39.068 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onCreate 01-08 11:48:39.069 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onStart 01-08 11:48:39.069 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onResume
點(diǎn)擊“點(diǎn)擊此按鈕,可啟動(dòng)新的Activity”按鈕,效果圖如下所示

相應(yīng)的日志如下所示:
01-08 11:57:44.455 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onPause 01-08 11:57:44.465 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityB---------onCreate 01-08 11:57:44.466 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityB---------onStart 01-08 11:57:44.466 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityB---------onResume 01-08 11:57:44.843 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onStop
點(diǎn)擊返回鍵,返回ActivityA,日志如下所示:
01-08 12:22:40.318 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityB---------onPause 01-08 12:22:40.319 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onRestart 01-08 12:22:40.319 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onStart 01-08 12:22:40.319 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityA---------onResume 01-08 12:22:41.125 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityB---------onStop 01-08 12:22:41.125 3021-3021/activitylifecycle.xe.com.activitylifecycle D/Activity: ActivityB---------onDestroy
由于技術(shù)水平有限,文章中難免會(huì)有錯(cuò)誤,歡迎大家批評(píng)指正,另外附上小demoActivity生命周期的方法調(diào)用過(guò)程,謝謝大家的閱讀。~~~~
以上就是Android非異常情況下的Activity生命周期分析的詳細(xì)內(nèi)容,更多關(guān)于Android Activity生命周期的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android Camera2實(shí)現(xiàn)最簡(jiǎn)單的預(yù)覽框顯示
這篇文章主要為大家詳細(xì)介紹了Android Camera2實(shí)現(xiàn)最簡(jiǎn)單的預(yù)覽框顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android使用 PopupWindow 實(shí)現(xiàn)底部彈窗功能
這篇文章主要介紹了Android使用 PopupWindow 實(shí)現(xiàn)底部彈窗功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Kotlin Flow常見(jiàn)場(chǎng)景下的使用實(shí)例
這篇文章主要為大家介紹了Kotlin Flow常見(jiàn)場(chǎng)景下的使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Android實(shí)現(xiàn)動(dòng)畫效果的自定義下拉菜單功能
這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)畫效果的自定義下拉菜單功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
在android開(kāi)發(fā)中進(jìn)行數(shù)據(jù)存儲(chǔ)與訪問(wèn)的多種方式介紹
很多時(shí)候我們的軟件需要對(duì)處理后的數(shù)據(jù)進(jìn)行存儲(chǔ)或再次訪問(wèn),Android為數(shù)據(jù)存儲(chǔ)提供了多種方式,首先給大家介紹使用文件如何對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),感興趣的朋友可以了解下哈2013-06-06
Android實(shí)現(xiàn)拍照或者選取本地圖片
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照或者選取本地圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
RecyclerView中使用CheckBox出現(xiàn)勾選混亂的解決方法
這篇文章主要為大家詳細(xì)介紹了RecyclerView中使用CheckBox出現(xiàn)勾選混亂的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android進(jìn)程運(yùn)行中權(quán)限被收回導(dǎo)致關(guān)閉的問(wèn)題解決
在Android開(kāi)發(fā)中我們可能會(huì)遇到這樣的問(wèn)題,進(jìn)程還在運(yùn)行著某些權(quán)限卻被收回了,這就導(dǎo)致進(jìn)程崩潰被迫關(guān)閉,本篇文章將帶你了解這個(gè)問(wèn)題的發(fā)生與解決方法2021-10-10
Android使用RecyclerView實(shí)現(xiàn)投票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android使用RecyclerView實(shí)現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
使用Android Studio創(chuàng)建OpenCV4.1.0 項(xiàng)目的步驟
這篇文章主要介紹了使用Android Studio創(chuàng)建OpenCV4.1.0 項(xiàng)目的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

