什么是Activity?Activity的生命周期!

剛剛接觸安卓,水平不高但是憑自己的堅持相信能有一個不錯的結(jié)果,努力一把,趁著年輕逼自己學點東西,貼貼微博希望能得到大家鼓勵,share make us better,加油年輕人?。?/h2>

1.什么是Activity

Activity是安卓四大組件之一(還有Service、BroadcastReceiver、ContentProvider),在日常應(yīng)用中Activity是與用戶交互的接口,它提供了一個用戶完成相關(guān)操作的窗口。當我們在開發(fā)中創(chuàng)建Activity后,通過調(diào)用setContentView(View)方法來給該Activity指定一個布局界面,而這個界面就是提供給用戶交互的接口。Android系統(tǒng)中是通過Activity棧的方式來管理Activity的,而Activity自身則是通過生命周期的方法來管理的自己的創(chuàng)建與銷毀,既然如此,現(xiàn)在我們就來看看Activity生命周期是如何運作的。

1.生命周期中各個方法的含義和作用

(1)onCreate:create表示創(chuàng)建,這是Activity生命周期的第一個方法,也是我們在android開發(fā)中接觸的最多的生命周期方法。它本身的作用是進行Activity的一些初始化工作,比如使用setContentView加載布局,對一些控件和變量進行初始化等。但也有很多人將很多與初始化無關(guān)的代碼放在這,其實這是不規(guī)范的。此時Activity還在后臺,不可見。所以動畫不應(yīng)該在這里初始化,因為看不到……

(2)onStart:start表示啟動,這是Activity生命周期的第二個方法。此時Activity已經(jīng)可見了,但是還沒出現(xiàn)在前臺,我們還看不到,無法與Activity交互。其實將Activity的初始化工作放在這也沒有什么問題,放在onCreate中是由于官方推薦的以及我們開發(fā)的習慣。

(3)onResume:resume表示繼續(xù)、重新開始,這名字和它的職責也相同。此時Activity經(jīng)過前兩個階段的初始化已經(jīng)蓄勢待發(fā)。Activity在這個階段已經(jīng)出現(xiàn)在前臺并且可見了。這個階段可以打開獨占設(shè)備

(4)onPause:pause表示暫停,當Activity要跳到另一個Activity或應(yīng)用正常退出時都會執(zhí)行這個方法。此時Activity在前臺并可見,我們可以進行一些輕量級的存儲數(shù)據(jù)和去初始化的工作,不能太耗時,因為在跳轉(zhuǎn)Activity時只有當一個Activity執(zhí)行完了onPause方法后另一個Activity才會啟動,而且android中指定如果onPause在500ms即0.5秒內(nèi)沒有執(zhí)行完畢的話就會強制關(guān)閉Activity。從生命周期圖中發(fā)現(xiàn)可以在這快速重啟,但這種情況其實很罕見,比如用戶切到下一個Activity的途中按back鍵快速得切回來。

(5)onStop:stop表示停止,此時Activity已經(jīng)不可見了,但是Activity對象還在內(nèi)存中,沒有被銷毀。這個階段的主要工作也是做一些資源的回收工作。

(6)onDestroy:destroy表示毀滅,這個階段Activity被銷毀,不可見,我們可以將還沒釋放的資源釋放,以及進行一些回收工作。

(7)onRestart:restart表示重新開始,Activity在這時可見,當用戶按Home鍵切換到桌面后又切回來或者從后一個Activity切回前一個Activity就會觸發(fā)這個方法。

一張來自官方文檔(http://developer.android.com/reference/android/app/Activity.html)的圖,相信大家都看到過。

現(xiàn)在我們來說一下方法的具體流程:

1.Activity實例是由系統(tǒng)自動創(chuàng)建,并在不同的狀態(tài)期間回調(diào)相應(yīng)的方法。一個最簡單的完整的Activity生命周期會按照如下順序回調(diào):onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。稱之為entire lifetime。

2.當執(zhí)行onStart回調(diào)方法時,Activity開始被用戶所見(也就是說,onCreate時用戶是看不到此Activity的,那用戶看到的是哪個?當然是此Activity之前的那個Activity),一直到onStop之前,此階段Activity都是被用戶可見,稱之為visible lifetime。

3.當執(zhí)行到onResume回調(diào)方法時,Activity可以響應(yīng)用戶交互,一直到onPause方法之前,此階段Activity稱之為foreground lifetime。

在實際應(yīng)用場景中:

假設(shè)A Activity位于棧頂,此時用戶操作,從A Activity跳轉(zhuǎn)到B Activity。那么對AB來說,具體會回調(diào)哪些生命周期中的方法呢?回調(diào)方法的具體回調(diào)順序又是怎么樣的呢?

開始時,A被實例化,執(zhí)行的回調(diào)有A:onCreate -> A:onStart -> A:onResume。

當用戶點擊A中按鈕來到B時,假設(shè)B全部遮擋住了A,將依次執(zhí)行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此時如果點擊Back鍵,將依次執(zhí)行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy

至此,Activity棧中只有A。在Android中,有兩個按鍵在影響Activity生命周期這塊需要格外區(qū)分下,即Back鍵和Home鍵。

此時如果按下Back鍵,系統(tǒng)返回到桌面,并依次執(zhí)行A:onPause -> A:onStop -> A:onDestroy。

此時如果按下Home鍵(非長按),系統(tǒng)返回到桌面,并依次執(zhí)行A:onPause -> A:onStop。由此可見,Back鍵和Home鍵主要區(qū)別在于是否會執(zhí)行onDestroy。

此時如果長按Home鍵,不同手機可能彈出不同內(nèi)容,Activity生命周期未發(fā)生變化(由小米2s測的,不知道其他手機是否會對Activity生命周期有影響)。

由于Android本身的特性,使得現(xiàn)在不少應(yīng)用都沒有直接退出應(yīng)用程序的功能,按照一般的邏輯,當Activity棧中有且只有一個Activity時,當按下Back鍵此Activity會執(zhí)行onDestroy,那么下次點擊此應(yīng)用程圖標將從重新啟動,因此,當前不少應(yīng)用程序都是采取如Home鍵的效果,當點擊了Back鍵,系統(tǒng)返回到桌面,然后點擊應(yīng)用程序圖標,直接回到之前的Activity界面.

驗證幾個主要的生命周期情況

package com.cmcm.activitylifecycle;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;

import android.view.View;import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button bt;

/** * Activity創(chuàng)建時被調(diào)用 * @param savedInstanceState */

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LogUtils.e("onCreate is invoke!!!");

bt= (Button) findViewById(R.id.bt);

bt.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(MainActivity.this,SecondActivity.class); startActivity(i);

} }); }

/** * Activity從后臺重新回到前臺時被調(diào)用 */

@Override

protected void onRestart() {

super.onRestart();

LogUtils.e("onRestart is invoke!!!");

}

/** *Activity創(chuàng)建或者從后臺重新回到前臺時被調(diào)用 */

@Override

protected void onStart() {

super.onStart();

LogUtils.e("onStart is invoke!!!");

}

/** *Activity創(chuàng)建或者從被覆蓋、后臺重新回到前臺時被調(diào)用 */

@Override

protected void onResume() {

super.onResume();

LogUtils.e("onResume is invoke!!!");

}

/** * Activity被覆蓋到下面或者鎖屏時被調(diào)用 */

@Override

protected void onPause() {

super.onPause(); LogUtils.e("onPause is invoke!!!");

}

/** *退出當前Activity或者跳轉(zhuǎn)到新Activity時被調(diào)用 */

@Override

protected void onStop() {

super.onStop(); LogUtils.e("onStop is invoke!!!");

}

/** *退出當前Activity時被調(diào)用,調(diào)用之后Activity就結(jié)束了 */

@Override

protected void onDestroy() {

super.onDestroy(); LogUtils.e("onDestroy is invoke!!!");

}

}


下面我們倆綜合分析幾種生命周期方法的調(diào)用情況

1.我們先來分析Activity啟動過程中所調(diào)用的生命周期方法,運行程序截圖如下:

從Log中我們可以看出Activity啟動后,先調(diào)用了onCreate方法,然后是onStart方法,最后是onResume方法,進入運行狀態(tài),此時Activity已在前臺顯示。因此, Activity啟動–>onCreate()–>onStart()–>onResume()依次被調(diào)用

2.當前Activity創(chuàng)建完成后,按Home鍵回到主屏。按如上操作運行截圖:


從Log中我們可以看出Activity啟動后,先調(diào)用了onCreate方法,然后是onStart方法,最后是onResume方法,進入運行狀態(tài),此時Activity已在前臺顯示。因此, Activity啟動–>onCreate()–>onStart()–>onResume()依次被調(diào)用 2.當前Activity創(chuàng)建完成后,按Home鍵回到主屏。按如上操作運行截圖:

3.當我們點擊Home鍵回到主界面后,再次點擊App回到Activity時,調(diào)用結(jié)果如下:


我們可以發(fā)現(xiàn)重新回到Activity時,調(diào)用了onRestart方法,onStart方法,onResume方法。因此, 當我們再次回到原Activity時–>onRestart()–>onStart()–>onResume()依次被調(diào)用

4.當我們在原有的Activity的基礎(chǔ)上打新的Activity時,調(diào)用結(jié)果如下:

我們可看到原來的Activity調(diào)用的了onPause方法和onStop方法。也就是說 在原Activity的基礎(chǔ)上開啟新的Activity,原Activity生命周期執(zhí)行方法順序為–>onPause()–>onStop(),事實上跟點擊home鍵是一樣的。但是這里有點要注意的是如果新的Activity使用了透明主題,那么當前Activity不會回調(diào)onStop方法。同時我們發(fā)現(xiàn)新Activity(SecondActivity)生命周期方法是在原Activity的onPause方法執(zhí)行完成后才可以被回調(diào),這也就是前面我們?yōu)槭裁凑f在onPause方法不能操作耗時任務(wù)的原因了。

5 當我們點擊Back鍵回退時,回調(diào)結(jié)果如下:

從Log我們可以看出,當點擊Back鍵回退時,相當于退出了當前Activity,Activity將被銷毀,因此 退出當前Activity時–>onPause()–>onStop()–>onDestroy()依次被調(diào)用

小結(jié):到這里我們來個小結(jié),當Activity啟動時,依次會調(diào)用onCreate(),onStart(),onResume(),而當Activity退居后臺時(不可見,點擊Home或者被新的Activity完全覆蓋),onPause()和onStop()會依次被調(diào)用。當Activity重新回到前臺(從桌面回到原Activity或者被覆蓋后又回到原Activity)時,onRestart(),onStart(),onResume()會依次被調(diào)用。當Activity退出銷毀時(點擊back鍵),onPause(),onStop(),onDestroy()會依次被調(diào)用,到此Activity的整個生命周期方法回調(diào)完成。現(xiàn)在我們再回頭看看之前的流程圖,應(yīng)該是相當清晰了吧。嗯,這就是Activity整個典型的生命周期過程。下篇我們再來聊聊Activity的異常生命周期。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 溝通之【用正確的方法去做對的事】 很多人只注重做對的事,但是僅僅做對的事情,而沒有科學合理的方法,也不一定會達到期...
    帆野先生閱讀 1,579評論 0 1
  • 明星再耀眼 也替代不了明月 明月再清亮 也替代不了太陽 太陽再光輝 也替代不了心臟 心臟再蓬勃 也替代不了希望
    琳之楓閱讀 190評論 0 0
  • 夜不會長眠,念沒有無源 2017.8.24 晴 又是一年秋風起,天氣時好時壞,人的思緒也跟著變得繁...
    於昭閱讀 484評論 5 2
  • 今天是到小屋的第二天,本來今天上午有個會議要去拍攝、但是最后取消了,還是有點失落的,畢竟現(xiàn)在比較窮,所以我睡到了1...
    愛一人閱讀 318評論 0 0

友情鏈接更多精彩內(nèi)容