概述
簡介
- 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的整個生命週期都是依賴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的四種狀態
- Active/Runing
一個新 Activity 啓動入棧後,它顯示在屏幕最前端,處理是處於棧的最頂端(Activity棧頂),此時它處於可見並可和用戶交互的激活狀態,叫做活動狀態或者運行狀態(active or running)。 - Paused
當 Activity失去焦點, 被一個新的非全屏的Activity 或者一個透明的Activity 覆蓋,此時的狀態叫做暫停狀態(Paused)。此時它依然與窗口管理器保持連接,Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存不足的時候會被強行終止掉。所以它仍然可見,但已經失去了焦點,不可與用戶進行交互。 - Stoped
如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被強行終止掉。 - 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