Android四大組件之Activity

概述

簡(jiǎn)介

  • Activity是Android組件中最基本也是最為常見(jiàn)的四大組件(Activity,Service服務(wù),ContentProvider內(nèi)容提供者,BroadcastReceiver廣播接收器)之一 。它是一個(gè)應(yīng)用程序組件,提供一個(gè)屏幕,用戶可以用來(lái)交互為了完成某項(xiàng)任務(wù);
  • Activity中所有操作都與用戶密切相關(guān),是一個(gè)負(fù)責(zé)與用戶交互的組件,可以通過(guò)setContentView(View)來(lái)顯示指定控件;
  • 在一個(gè)android應(yīng)用中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些控件也可以監(jiān)聽(tīng)并處理用戶的事件做出響應(yīng);
  • Activity之間通過(guò)Intent進(jìn)行通信。

本質(zhì)

官方給的解釋:An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.
Activity就是一個(gè)為用戶提供可以和其他事物進(jìn)行交互的屏幕的組件,例如:打電話、拍照、發(fā)送郵件、瀏覽地圖等等。
生命周期
==

簡(jiǎn)介##

Activity生命周期思維導(dǎo)圖

這是官方給出的Activity生命周期的思維導(dǎo)圖,Activity的整個(gè)生命周期都是依賴onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()這7個(gè)方法來(lái)完成。
舉個(gè)栗子
創(chuàng)建一個(gè)最簡(jiǎn)單的Android程序,該程序只有一個(gè)Activity,程序運(yùn)行時(shí)打開(kāi)Activity,點(diǎn)擊back鍵關(guān)閉Activity。這個(gè)過(guò)程就會(huì)將6個(gè)方法全部調(diào)用一遍。詳情如下:
在加載程序時(shí),依次調(diào)用onCreate()創(chuàng)建Activity;onStart()啟動(dòng)Activity;onResume()使得Activity可見(jiàn)。
back鍵關(guān)閉Activity時(shí)依次調(diào)用onPause()暫停Activity;onStop停止Activity但不釋放資源;onDestory()銷毀Activity。

Activity的四種狀態(tài)

  1. Active/Runing
    一個(gè)新 Activity 啟動(dòng)入棧后,它顯示在屏幕最前端,處理是處于棧的最頂端(Activity棧頂),此時(shí)它處于可見(jiàn)并可和用戶交互的激活狀態(tài),叫做活動(dòng)狀態(tài)或者運(yùn)行狀態(tài)(active or running)。
  2. Paused
    當(dāng) Activity失去焦點(diǎn), 被一個(gè)新的非全屏的Activity 或者一個(gè)透明的Activity 覆蓋,此時(shí)的狀態(tài)叫做暫停狀態(tài)(Paused)。此時(shí)它依然與窗口管理器保持連接,Activity依然保持活力(保持所有的狀態(tài),成員信息,和窗口管理器保持連接),但是在系統(tǒng)內(nèi)存不足的時(shí)候會(huì)被強(qiáng)行終止掉。所以它仍然可見(jiàn),但已經(jīng)失去了焦點(diǎn),不可與用戶進(jìn)行交互。
  3. Stoped
    如果一個(gè)Activity被另外的Activity完全覆蓋掉,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息,但是它不再可見(jiàn),所以它的窗口被隱藏,當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時(shí)候,Stopped的Activity將被強(qiáng)行終止掉。
  4. Killed
    如果一個(gè)Activity是Paused或者Stopped狀態(tài),系統(tǒng)可以將該Activity從內(nèi)存中刪除,Android系統(tǒng)采用兩種方式進(jìn)行刪除,要么要求該Activity結(jié)束,要么直接終止它的進(jìn)程。當(dāng)該Activity再次顯示給用戶時(shí),它必須重新開(kāi)始和重置前面的狀態(tài)。

舉幾個(gè)實(shí)實(shí)在在的栗子
創(chuàng)建一個(gè)只有一個(gè)Activity的Android程序,命名ActivityLifeCycleTest,并重寫(xiě)7個(gè)方法(這里不會(huì)用到onRestart方法,但是先寫(xiě)上),在每個(gè)方法中打印日志,代碼如下


    public static final String TAG = "lifecircle";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "MainActivity   onCreate");
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "MainActivity   onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "MainActivity   onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "MainActivity   onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "MainActivity   onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "MainActivity   onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "MainActivity   onDestroy");
    }

然后運(yùn)行程序,查看logcat中的日志(查看前先設(shè)置一下日志過(guò)濾器),如下圖

01-28 15:19:28.811 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onCreate
01-28 15:19:28.913 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onStart
01-28 15:19:28.913 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onResume

根據(jù)日志可知,當(dāng)加載一個(gè)Activity依次調(diào)用onCreate(),onStart(),onResume()
然后點(diǎn)擊back鍵,關(guān)閉Activity,log如下

......
......
01-28 15:24:47.101 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onPause
01-28 15:24:47.535 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onStop
01-28 15:24:47.536 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onDestroy

所以,關(guān)閉Activity時(shí)依次執(zhí)行onPause(),onStop(),onDestory().
接下來(lái)點(diǎn)兒復(fù)雜滴
在項(xiàng)目中新建一個(gè)Activity,命名為NormalActivity,從MainActivity中跳轉(zhuǎn)過(guò)去,在NormalActivity中也重寫(xiě)6個(gè)方法。代碼如下

public static final String TAG = "lifecircle";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "NormalActivity   onCreate");
        setContentView(R.layout.activity_normal);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "NormalActivity   onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "NormalActivity   onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "NormalActivity   onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "NormalActivity   onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "NormalActivity   onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "NormalActivity   onRestart");
    }

現(xiàn)在重新運(yùn)行程序,使用intent跳轉(zhuǎn)到NormalActivity(代碼略過(guò)),查看log

......
......
01-28 15:42:38.994 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onPause
01-28 15:42:39.028 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity   onCreate
01-28 15:42:39.038 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity   onStart
01-28 15:42:39.038 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity   onResume
01-28 15:42:39.564 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onStop

首先調(diào)用MainActivity的onPause方法將其暫停,然后三部曲創(chuàng)建NormalActivity,然后再onStop掉MainActivity,(這里為什么不直接onStop掉MainActivity再創(chuàng)建NormalActivity,因?yàn)閭ゴ蟮腁ndroid開(kāi)發(fā)者早已想到萬(wàn)一NormalActivity創(chuàng)建失敗,MainActivity還可以繼續(xù)使用,避免出現(xiàn)黑屏,影響用戶體驗(yàn)),此時(shí)MainActivity并沒(méi)有銷毀,仍然保存在內(nèi)存中,如果此時(shí)內(nèi)存不足,系統(tǒng)會(huì)將其銷毀。既然沒(méi)有銷毀,自然是可以恢復(fù)的,恢復(fù)就需要調(diào)用onRstart方法,按back鍵返回MainActivity,查看log

......
......
01-28 15:53:27.319 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity   onPause
01-28 15:53:27.334 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onRestart
01-28 15:53:27.336 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onStart
01-28 15:53:27.336 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onResume
01-28 15:53:27.698 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity   onStop
01-28 15:53:27.698 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity   onDestroy

先暫停NormalActivity,然后執(zhí)行onRestart方法,重啟MainActivity,不需要重新創(chuàng)建,最后銷毀掉NormalActivity。

如果不是跳轉(zhuǎn)到另一個(gè)普通的Activity,而是啟動(dòng)一個(gè)彈出框會(huì)怎樣呢?
創(chuàng)建一個(gè)DialogActivity,重寫(xiě)7個(gè)方法,代碼如下


    public static final String TAG = "lifecircle";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "DialogActivity   onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "DialogActivity   onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "DialogActivity   onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "DialogActivity   onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "DialogActivity   onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "DialogActivity   onRestart");
    }

運(yùn)行程序,啟動(dòng)DialogActivity(啟動(dòng)代碼省略),查看log

......
......
01-28 16:11:12.277 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onPause
01-28 16:11:12.313 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity   onStart
01-28 16:11:12.313 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity   onResume

此時(shí)MainActivity只是暫停,并不會(huì)stop,此時(shí)Activity處于前面所說(shuō)的第二種狀態(tài):Paused;按back鍵返回,查看log

......
01-28 16:14:05.881 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity   onPause
01-28 16:14:05.911 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: MainActivity   onResume
01-28 16:14:05.960 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity   onStop
01-28 16:14:05.960 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity   onDestroy

此時(shí)只需調(diào)用onResume方法,即可返回到MainActivity。

項(xiàng)目源碼下載地址
Github:https://github.com/yueryouayou/ActivityLifeCycleTest
CSDN:http://download.csdn.net/detail/shiquanqq/9421165

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

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

  • 關(guān)于為什么要寫(xiě)屬于自己的博客,我在前一篇文章中也提到了。主要是歸納自己這一個(gè)時(shí)期所學(xué)到的知識(shí),幫助自己更好的理解,...
    Kevin_Jern閱讀 1,023評(píng)論 0 8
  • 本節(jié)開(kāi)始講解Android的四大組件之一的Activity 官方介紹: Activity 是一個(gè)應(yīng)用組件,用戶可與...
    pifoo閱讀 729評(píng)論 0 5
  • Activity簡(jiǎn)介 Activity是Android一個(gè)非常重要的用戶接口(四大組件之一),是可見(jiàn)的,主要是用戶...
    艾曼大山閱讀 567評(píng)論 0 3
  • 沒(méi)有難點(diǎn),沒(méi)有不會(huì)的,只是匆匆的留個(gè)筆記。。。。。 簡(jiǎn)介 Activity是Android一個(gè)非常重要的用戶接口(...
    一s獨(dú)秀閱讀 604評(píng)論 0 0
  • 我瞇縫著眼睛等天空放晴看云朵墜落到海平線看木棉蓄勢(shì)發(fā)出愛(ài)你的宣言久違的同步與生生循環(huán)壓斷幾個(gè)世紀(jì)醞釀的酒意拾起神像...
    WONKA瓦南閱讀 211評(píng)論 0 1

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