Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android活動生命周期

Android活動生命周期

編輯:關於Android編程

一、Android活動

活動是 Android 應用框架中的一個核心組件,它在一個窗口(Window)對象中繪制用戶接口並響應用戶的交互。

Android四大核心組件分別為Activity(活動)、Service(服務)、Content provider(數據源)、Broadcastreceiver(廣播接收器)。

官方文檔是這麼定義的:“AnActivityisan application component that provides a screen with which users can interactin order to do something, such as dial the phone, take a photo, send an email,or view a map.”大概意思是說,Activity是一個可以讓屏幕提供用戶交互動作的組件,比如打電話、照相、發送郵件和查看地圖等。簡單來說,我們在應用程序中能看到的內容,絕大多數都是Activity組件提供的。

一個應用中通常包含多個活動,用戶在不同的活動中執行不同的操作,但只有一個處於“活躍”狀態:啟動一個新的活動,前一個就會停止並被壓入一個棧中。

一個Activity通常就是一個單獨的屏幕(窗口)。主要做的事情就是:繪制用戶接口、響應用戶交互。一個Android程序可有多個活動組成,多個活動通過Intent進行通信。

Android應用中每一個Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統將不識別也不執行該Activity。

Activity活動的類圖:

\

由上圖可以看出,活動Activity這個類的直接父類是ContextThemeWarpper,圖中Activity類指出去的虛線箭頭都是Activity類所實現的接口。活動(Activity)是上下文(Context)的子類型,實現了窗口、鍵盤事件的的回調,還實現了布局擴展及創建上下文菜單的接口

二、Android活動的創建和使用

1.創建一個Activity

創建一個活動,通常直接繼承 Activity類,並在子類中重寫一系列的回調方法;

2.聲明活動---在manifest中注冊Activity

除了要定義和繼承Activity之外,我們還需要在manifest中進行注冊,表示聲明,如果不聲明的話,這個Activity在運行時候,會報ANR錯誤,就是應用程序沒有響應。那麼怎麼聲明呢,我們每新建一個項目時候,都會有一個AndroidManifest.xml文件,我們需要在AndroidManifest.xml文件中對我們的Activity進行注冊。

\

可以看到,活動的注冊在標簽中,這裡通過標簽來對活動進行注冊的。

Android:name屬性來具體注冊哪一個活動,在這裡我們對我們剛才定義的MainActivity類進行注冊,由於在最外層的標簽中已經通過package屬性指定了包名是com.example.helloworld,因此在注冊活動時這一部分就可以省略了,當然你可以定義為com.example.helloworld.MainActivity,不過直接使用.MainActivity也就足夠了。

Android:label指定活動中的標題欄的內容,標題欄是顯示在活動的最頂部的,需要注意的是,給主活動指定的label不僅會成為標題欄的內容,還會成為啟動器(Launcher)中應用程序顯示的名稱。之後在標簽的內容我們加入了標簽,並在這個標簽裡添加了和這兩句聲明。表示在手機上點擊應用圖標時,首先啟動的就是這個活動,如果你的應用程序中沒有聲明任何一個活動作為主活動,這個程序仍然是可以正常安裝的,只是你無法在啟動中看到或者打開這個程序。這種沒有主活動的應用程序,基本都是用為第三方服務居多,比如支付寶快捷支付服務。

最後再給這個活動增加業務邏輯、事件處理。

三、Android活動生命周期

1、生命周期概述

Android系統是一個多任務(Multi-Task)的操作系統,可以在用手機聽音樂的同時,也執行其他多個程序(APP)。每多執行一個應用程序,就會多耗費一些系統內存,當同時執行的程序過多,或是關閉的程序沒有正確釋放掉內存,系統就會覺得越來越慢,甚至不穩定。

為了解決這個問題, Android 引入了一個新的機制----- 生命周期(Life Cycle)。Android 應用程序的生命周期是由Android 框架進行管理,而不是由應用程序直接控制。通常,每一個應用程序(入口一般會是某一個Activity 的onCreate 方法),都會產生一個進程(Process)。當系統內存即將不足的時候,會依照優先級自動進行進程(Process)的回收。不管是使用者或開發者,都無法確定的應用程序何時會被回收。所以為了很好的防止數據丟失和其他問題,了解生命周期很重要。

2、活動的生命周期-示意圖:

\

圖中白色矩形框中的方法,都是跟活動Activity生命周期相關的函數。

onCreate():每個活動中我們都會重寫這個方法,它會在活動第一次被創建的時候調用,比如完成一些初始化操作,加載布局、綁定事件等

onStart():這個方法在活動不可見變為可見的時候調用;執行該方法後,活動就顯示可見了。

onResume():這個方法在活動准備好和用戶進行交互的時候調用,此時的活動一定位於返回棧的棧頂、並且處於運行狀態;執行該方法後,活動即獲得焦點。

onPause():這個方法在系統准備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中將一些消耗CPU的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。執行該方法後,失去焦點,不能再進行用戶交互。

onStop():這個方法在活動完全不可見的時候調用。它和onPause()方法主要區別在於,如果啟動的新活動是一個對話框式的活動,那麼onPause()方法會得到執行,而onStop()方法不會執行。執行該方法後,活動不可見,進入“後台”。

onDestroy():這個方法在活動被銷毀之前調用,之後活動的狀態將變為銷毀狀態。

onRestart():這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。

3、生命周期—分類

根據活動的復雜度,也許並不需要實現所有生命周期中的方法,但需要知道每個方法的功能,確保你的應用能像用戶期望的那樣執行;避免出現以下情況:

不會因為來電話或切換到其他應用而崩潰;

用戶離開應用一段時間後返回,不會丟失進度;

用戶設備屏幕旋轉時,不會丟失進度或崩潰;

GPS 或其他傳感器在不需要時不要一直消耗電量;

創建一個活動,通常直接繼承 Activity,並在子類中重寫一系列的回調方法;在活動狀態發生改變時,這些方法由應用框架按照特定的順序調用,我們稱其為活動的生命周期;該周期按照執行的時間順序可劃分為:

1. 完全生命周期

2. 可見生命周期

3. 前台生命周期

1. 完全生命周期

活動在onCreate()和onDestroy()方法之間所經歷的。就是上圖所描述的順序執行下來的過程。

\

2. 可見生命周期

活動在onStart()和onStop()方法之間所經歷的。

回調方法

描述

onRestart

活動從隱藏狀態進入可見狀態

onStart

活動進入可見狀態:

初始化 onStop 是釋放的資源:如注冊廣播接收器

onResume

活動到前台,UI獲得焦點,進入運行狀態

onPause

活動被另一個半透明或對話框(非全屏)的活動遮擋,仍然可見,但失去焦點,不可以操作。

停止動畫或正在執行的操作,提交沒有保存的改變

onStop

活動到後台,不可見,但依然存活

保存數據(文件或數據庫)

注銷廣播接收器

3. 前台生命周期

也叫交互活動期,活動在onResume()和onPause()方法之間所經歷的。

\

為方便理解,在下圖中做了范圍對比:

\

4、保存活動狀態

在系統內存不足時,系統會把處於暫停或停止狀態的活動銷毀;當用戶要再次回到已被銷毀的活動時,系統會重新創建該活動;此時,會回調以下方法:

onSaveInstanceState(Bundle savedInstanceState)

onRestoreInstanceState(Bundle savedInstanceState)

\

四、活動的任務棧

在Android中,多個Activity定義在一個Task中,也就是說一個Task是一組Activity的集合,然後Activity又被安排在back stack,即返回棧,是按照後進先出的規則進出棧的。如圖:

\

當從手機中啟動一個應用程序圖標時,應用程序的Task隨之也變成前台進程,如果首次啟用時,發現不存在Task實例,那麼系統會創建一個Task實例,然後把"main”Activity放入到stack中,默認是棧頂,這樣一個Task就管理了一組棧,棧裡管理多個Activity。當從Activity1中啟動Activity2時,Activity1被推到棧底,Activity2變成棧頂,同理,Activity3進棧的過程和Activity2是一樣的,如果我們按back按鈕,則Activity3被彈出,系統會根據內存情況進行銷售或者回收,Activity2則被推到棧頂,以此類推。當一直按back,返回到主頁面,則所有的activitys被全部彈出,則task不復存在。

同時,task有兩種狀態:Foreground和Background,前景和背景。當處於Background時,所有的activitys是停止的,當處於Foreground時,表示當前用戶交互的應用程序。

\

比如兩個應用程序A和B,我們剛開始啟動了A應用程序,此時Task A是Foreground,用於與用戶交互,當我們點擊Home Button時,此時Task A變成Background,裡面所有的activitys都是停止的,此時如果我們又啟動了B應用程序,Task B又會被實例化,TaskB變成Foreground,不過Task A仍然是Background,一直等待著被恢復。所以是Android也是一個多任務的系統,不同任務是可以被互相切換的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved