編輯:關於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這個類的直接父類是ContextThemeWarpper,圖中Activity類指出去的虛線箭頭都是Activity類所實現的接口。活動(Activity)是上下文(Context)的子類型,實現了窗口、鍵盤事件的的回調,還實現了布局擴展及創建上下文菜單的接口
創建一個活動,通常直接繼承 Activity類,並在子類中重寫一系列的回調方法;
除了要定義和繼承Activity之外,我們還需要在manifest中進行注冊,表示聲明,如果不聲明的話,這個Activity在運行時候,會報ANR錯誤,就是應用程序沒有響應。那麼怎麼聲明呢,我們每新建一個項目時候,都會有一個AndroidManifest.xml文件,我們需要在AndroidManifest.xml文件中對我們的Activity進行注冊。
可以看到,活動的注冊在標簽中,這裡通過標簽來對活動進行注冊的。
Android:name屬性來具體注冊哪一個活動,在這裡我們對我們剛才定義的MainActivity類進行注冊,由於在最外層的
Android:label指定活動中的標題欄的內容,標題欄是顯示在活動的最頂部的,需要注意的是,給主活動指定的label不僅會成為標題欄的內容,還會成為啟動器(Launcher)中應用程序顯示的名稱。之後在標簽的內容我們加入了
最後再給這個活動增加業務邏輯、事件處理。
Android系統是一個多任務(Multi-Task)的操作系統,可以在用手機聽音樂的同時,也執行其他多個程序(APP)。每多執行一個應用程序,就會多耗費一些系統內存,當同時執行的程序過多,或是關閉的程序沒有正確釋放掉內存,系統就會覺得越來越慢,甚至不穩定。
為了解決這個問題, Android 引入了一個新的機制----- 生命周期(Life Cycle)。Android 應用程序的生命周期是由Android 框架進行管理,而不是由應用程序直接控制。通常,每一個應用程序(入口一般會是某一個Activity 的onCreate 方法),都會產生一個進程(Process)。當系統內存即將不足的時候,會依照優先級自動進行進程(Process)的回收。不管是使用者或開發者,都無法確定的應用程序何時會被回收。所以為了很好的防止數據丟失和其他問題,了解生命周期很重要。
圖中白色矩形框中的方法,都是跟活動Activity生命周期相關的函數。
onCreate():每個活動中我們都會重寫這個方法,它會在活動第一次被創建的時候調用,比如完成一些初始化操作,加載布局、綁定事件等
onStart():這個方法在活動不可見變為可見的時候調用;執行該方法後,活動就顯示可見了。
onResume():這個方法在活動准備好和用戶進行交互的時候調用,此時的活動一定位於返回棧的棧頂、並且處於運行狀態;執行該方法後,活動即獲得焦點。
onPause():這個方法在系統准備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中將一些消耗CPU的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。執行該方法後,失去焦點,不能再進行用戶交互。
onStop():這個方法在活動完全不可見的時候調用。它和onPause()方法主要區別在於,如果啟動的新活動是一個對話框式的活動,那麼onPause()方法會得到執行,而onStop()方法不會執行。執行該方法後,活動不可見,進入“後台”。
onDestroy():這個方法在活動被銷毀之前調用,之後活動的狀態將變為銷毀狀態。
onRestart():這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。
根據活動的復雜度,也許並不需要實現所有生命周期中的方法,但需要知道每個方法的功能,確保你的應用能像用戶期望的那樣執行;避免出現以下情況:
不會因為來電話或切換到其他應用而崩潰;
用戶離開應用一段時間後返回,不會丟失進度;
用戶設備屏幕旋轉時,不會丟失進度或崩潰;
GPS 或其他傳感器在不需要時不要一直消耗電量;
創建一個活動,通常直接繼承 Activity,並在子類中重寫一系列的回調方法;在活動狀態發生改變時,這些方法由應用框架按照特定的順序調用,我們稱其為活動的生命周期;該周期按照執行的時間順序可劃分為:
1. 完全生命周期
2. 可見生命周期
3. 前台生命周期
活動在onCreate()和onDestroy()方法之間所經歷的。就是上圖所描述的順序執行下來的過程。
活動在onStart()和onStop()方法之間所經歷的。
回調方法
描述
onRestart
活動從隱藏狀態進入可見狀態
onStart
活動進入可見狀態:
初始化 onStop 是釋放的資源:如注冊廣播接收器
onResume
活動到前台,UI獲得焦點,進入運行狀態
onPause
活動被另一個半透明或對話框(非全屏)的活動遮擋,仍然可見,但失去焦點,不可以操作。
停止動畫或正在執行的操作,提交沒有保存的改變
onStop
活動到後台,不可見,但依然存活
保存數據(文件或數據庫)
注銷廣播接收器
也叫交互活動期,活動在onResume()和onPause()方法之間所經歷的。
為方便理解,在下圖中做了范圍對比:
在系統內存不足時,系統會把處於暫停或停止狀態的活動銷毀;當用戶要再次回到已被銷毀的活動時,系統會重新創建該活動;此時,會回調以下方法:
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也是一個多任務的系統,不同任務是可以被互相切換的。
寫在前面 上周把基於Redux的單頁應用開發完 緊接著就開始了ReactNative的開發。真的快得不可思議,只花了一周時間,我們兩個人就分工把APP也開發完了,並且同時
Service是在一段不定的時間運行在後台,不和用戶交互應用組件。每個Service必須在manifest中 通過<service>來聲明。可以通過conte
前言通過“計算器”應用我們已經熟悉了安卓應用開發的大致流程,具備了開發的初步知識。接下來,我們將開始制作一個“視頻播放器”
1,intentfilter說明:如果說是將一個activity有其他應用打開,或者是在webView 或者 bybird app中調用我們自己的activi