Android四大組件之Activity

概述

簡介

  • Activity是Android組件中最基本也是最爲常見的四大組件(Activity,Service服務,ContentProvider內容提供者,BroadcastReceiver廣播接收器)之一 。它是一個應用程序組件,提供一個屏幕,用戶可以用來交互爲了完成某項任務;
  • Activity中所有操作都與用戶密切相關,是一個負責與用戶交互的組件,可以通過setContentView(View)來顯示指定控件;
  • 在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應;
  • Activity之間通過Intent進行通信。

本質

官方給的解釋: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就是一個爲用戶提供可以和其他事物進行交互的屏幕的組件,例如:打電話、拍照、發送郵件、瀏覽地圖等等。

生命週期

簡介

Activity生命週期思維導圖
這是官方給出的Activity生命週期的思維導圖,Activity的整個生命週期都是依賴onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()這7個方法來完成。
舉個栗子
創建一個最簡單的Android程序,該程序只有一個Activity,程序運行時打開Activity,點擊back鍵關閉Activity。這個過程就會將6個方法全部調用一遍。詳情如下:
在加載程序時,依次調用onCreate()創建Activity;onStart()啓動Activity;onResume()使得Activity可見。
back鍵關閉Activity時依次調用onPause()暫停Activity;onStop停止Activity但不釋放資源;onDestory()銷燬Activity。

Activity的四種狀態

  1. Active/Runing
    一個新 Activity 啓動入棧後,它顯示在屏幕最前端,處理是處於棧的最頂端(Activity棧頂),此時它處於可見並可和用戶交互的激活狀態,叫做活動狀態或者運行狀態(active or running)。
  2. Paused
    當 Activity失去焦點, 被一個新的非全屏的Activity 或者一個透明的Activity 覆蓋,此時的狀態叫做暫停狀態(Paused)。此時它依然與窗口管理器保持連接,Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存不足的時候會被強行終止掉。所以它仍然可見,但已經失去了焦點,不可與用戶進行交互。
  3. Stoped
    如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被強行終止掉。
  4. Killed
    如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統採用兩種方式進行刪除,要麼要求該Activity結束,要麼直接終止它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。

舉幾個實實在在的栗子
創建一個只有一個Activity的Android程序,命名ActivityLifeCycleTest,並重寫7個方法(這裏不會用到onRestart方法,但是先寫上),在每個方法中打印日誌,代碼如下


    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");
    }

然後運行程序,查看logcat中的日誌(查看前先設置一下日誌過濾器),如下圖

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

根據日誌可知,當加載一個Activity依次調用onCreate(),onStart(),onResume()
然後點擊back鍵,關閉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

所以,關閉Activity時依次執行onPause(),onStop(),onDestory().
接下來點兒複雜滴
在項目中新建一個Activity,命名爲NormalActivity,從MainActivity中跳轉過去,在NormalActivity中也重寫6個方法。代碼如下

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");
    }

現在重新運行程序,使用intent跳轉到NormalActivity(代碼略過),查看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

首先調用MainActivity的onPause方法將其暫停,然後三部曲創建NormalActivity,然後再onStop掉MainActivity,(這裏爲什麼不直接onStop掉MainActivity再創建NormalActivity,因爲偉大的Android開發者早已想到萬一NormalActivity創建失敗,MainActivity還可以繼續使用,避免出現黑屏,影響用戶體驗),此時MainActivity並沒有銷燬,仍然保存在內存中,如果此時內存不足,系統會將其銷燬。既然沒有銷燬,自然是可以恢復的,恢復就需要調用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,然後執行onRestart方法,重啓MainActivity,不需要重新創建,最後銷燬掉NormalActivity。

如果不是跳轉到另一個普通的Activity,而是啓動一個彈出框會怎樣呢?
創建一個DialogActivity,重寫7個方法,代碼如下


    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");
    }

運行程序,啓動DialogActivity(啓動代碼省略),查看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

此時MainActivity只是暫停,並不會stop,此時Activity處於前面所說的第二種狀態: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

此時只需調用onResume方法,即可返回到MainActivity。

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

發佈了71 篇原創文章 · 獲贊 36 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章