概述
簡(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的整個(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)
- Active/Runing
一個(gè)新 Activity 啟動(dòng)入棧后,它顯示在屏幕最前端,處理是處于棧的最頂端(Activity棧頂),此時(shí)它處于可見(jiàn)并可和用戶交互的激活狀態(tài),叫做活動(dòng)狀態(tài)或者運(yùn)行狀態(tài)(active or running)。 - 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)行交互。 - 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)行終止掉。 - 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