請描述下Activity的生命週期

1. 創建 onCreate -  啓動onStart – 開始 onResume – 暫停 onPause – 結束 onStop – 銷燬onDestroy

2. 答:你自己寫的Activity會按需要重載這些方法,onCreate是免不了的,在一個Activity正常啓動的過程中,他們被調用的順序是 onCreate -> onStart -> onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,但是有人問了,程序正運行着呢來電話了,這個程序咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,如果打斷這個應用程序的是一個Theme爲Translucent 或者Dialog 的Activity那麼只是onPause ,恢復的時候onResume 。

3. Activty的生命週期的也就是它所在進程的生命週期。

   1.JPG 

每一個活動( Activity )都處於某一個狀態,對於開發者來說,是無法控制其應用程序處於某一個狀態的,這些均由系統來完成。 
但是當一個活動的狀態發生改變的時候,開發者可以通過調用 onXX() 的方法獲取到相關的通知信息。 
在實現 Activity 類的時候,通過覆蓋( override )這些方法即可在你需要處理的時候來調用。 
•onCreate :當活動第一次啓動的時候,觸發該方法,可以在此時完成活動的初始化工作。 
onCreate 方法有一個參數,該參數可以爲空( null ),也可以是之前調用 onSaveInstanceState()方法保存的狀態信息。
•onStart :該方法的觸發表示所屬活動將被展現給用戶。 
•onResume :當一個活動和用戶發生交互的時候,觸發該方法。 
•onPause :當一個正在前臺運行的活動因爲其他的活動需要前臺運行而轉入後臺運行的時候,觸發該方法。這時候需要將活動的狀態持久化,比如正在編輯的數據庫記錄等。 
•onStop :當一個活動不再需要展示給用戶的時候,觸發該方法。如果內存緊張,系統會直接結束這個活動,而不會觸發 onStop 方法。 所以保存狀態信息是應該在onPause時做,而不是onStop時做。活動如果沒有在前臺運行,都將被停止或者Linux管理進程爲了給新的活動預留足夠的存儲空間而隨時結束這些活動。因此對於開發者來說,在設計應用程序的時候,必須時刻牢記這一原則。在一些情況下,onPause方法或許是活動觸發的最後的方法,因此開發者需要在這個時候保存需要保存的信息。 
•onRestart :當處於停止狀態的活動需要再次展現給用戶的時候,觸發該方法。 
•onDestroy :當活動銷燬的時候,觸發該方法。和 onStop 方法一樣,如果內存緊張,系統會直接結束這個活動而不會觸發該方法。 
•onSaveInstanceState :系統調用該方法,允許活動保存之前的狀態,比如說在一串字符串中的光標所處的位置等。 
通常情況下,開發者不需要重寫覆蓋該方法,在默認的實現中,已經提供了自動保存活動所涉及到的用戶界面組件的所有狀態信息。
  
4. 必調用的三個方法:onCreate() –> onStart() –> onResume(),用AAA表示
(1)父Activity(A)啓動,點擊啓動子Activity(B),子Actvity退出,返回父Activity調用順序如下:
AAA –> onFreeze() –> onPause() –> B onCreate() -> B onStart() -> B onResume –> onStop() –> onRestart() –> onStart()->onResume()
(2)用戶點擊Home,Actvity調用順序如下
AAA –> onFreeze() –> onPause() –> onStop() — Maybe –> onDestroy()
( 3 ) 用戶點擊back鍵,Activity調用順序如下:
AAA-> onPause() –> onStop() –> onDestroy() ->onCreate()->onStart()->onResume()
(4)調用finish(), Activity調用順序如下 
AAA –> onPause() –> onStop() –> onDestroy() 
(5)在Activity上顯示dialog, Activity調用順序如下 
AAA -> onPause()
(6)在父Activity上顯示透明的或非全屏的activity,Activity調用順序如下 
AAA –> onFreeze() –> onPause() 
(7)設備進入睡眠狀態,Activity調用順序如下 
AAA –> onFreeze() –> onPause()

5. 和其他手機平臺的應用程序一樣,Android的應用程序的生命週期是被統一掌控的,也就是說我們寫的應用程序命運掌握在別人(系統)的手裏,我們不能改變它,只能學習並適應它。
簡單地說一下爲什麼是這樣:我們手機在運行一個應用程序的時候,有可能打進來電話發進來短信,或者沒有電了,這時候程序都會被中斷,優先去服務電話的基本功能,另外系統也不允許你佔用太多資源,至少要保證電話功能吧,所以資源不足的時候也就有可能被幹掉。 
言歸正傳,Activity的基本生命週期如下代碼所示: 
Java 代碼 
public class MyActivity extends Activity {  
protected void onCreate(Bundle savedInstanceState);  
protected  void onStart();
protected  void onResume();
protected  void onPause();
protected  void onStop();
protected  void onDestroy();
}   
        
       你自己寫的Activity會按需要重載這些方法,onCreate是免不了的,在一個Activity正常啓動的過程中,他們被調用的順序是 onCreate -> onStart -> onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,但是有人問了 ,程序正運行着呢來電話了,這個程序咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop,恢復的時候onStart->onResume,如果打斷這個應用程序的是一個Theme爲Translucent 或者Dialog 的Activity那麼只是onPause ,恢復的時候onResume 。 
詳細介紹一下這幾個方法中系統在做什麼以及我們應該做什麼: 
onCreate:   在這裏創建界面,做一些數據的初始化工作 
onStart:   到這一步變成用戶可見不可交互的 
onResume:   變成和用戶可交互的,(在activity棧系統通過棧的方式管理這些個Activity的最上面,運行完彈出棧,則回到上一個Activity) 
onPause:到這一步是可見但不可交互的,系統會停止動畫等消耗CPU 的事情
        從上文的描述已經知道,應該在這裏保存你的一些數據,因爲這個時候你的程序的優先級降低,有可能被系統收回。在這裏保存的數據,應該在onResume裏讀出來,注意:這個方法裏做的事情時間要短,因爲下一個activity不會等到這個方法完成才啓動 
onstop:變得不可見,被下一個activity覆蓋了 
onDestroy: 這是activity被幹掉前最後一個被調用方法了,可能是外面類調用finish方法或者是系統爲了節省空間將它暫時性的幹掉,可以用isFinishing()來判斷它,如果你有一個Progress Dialog在線程中轉動,請在onDestroy裏把他cancel掉,不然等線程結束的時候,調用Dialog的cancel方法會拋異常的。onPause,onstop, onDestroy,三種狀態下activity都有可能被系統幹掉,爲了保證程序的正確性,你要在onPause()裏寫上持久層操作的代碼,將用戶編輯的內容都保存到存儲介質上(一般都是數據庫 )。實際工作中因爲生命週期的變化而帶來的問題也很多,比如你的應用程序起了新的線程在跑,這時候中斷了,你還要去維護那個線程,是暫停還是殺掉還是數據回滾,是吧?因爲Activity可能被殺掉,所以線程中使用的變量和一些界面元素就千萬要注意了,一般我都是採用Android的消息機制 [Handler,Message]來處理多線程和界面交互的問題。這個我後面會講一些。 

相關問題:
1. 能說下Android應用的入口點嗎?
真正的Android入口點是application的main,你可以看下androidmanifest.xml的包含關係就清楚了。可以沒有Activity但是必須有Application。
2. 如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?
在”暫停 onPause” 狀態將數據保存。
3. 如何退出Activity?如何安全退出已調用多個Activity的Application?
對於單一Activity的應用來說,退出很簡單,直接finish()即可。當然,也可以用killProcess()和System.exit()這樣的方法。
http://blog.csdn.net/debug2/archive/2011/02/18/6193644.aspx

4. 返回鍵與Home鍵區別?
   back鍵默認行爲是finish處於前臺的Activity的,即Activity的狀態爲Destroy狀態爲止,再次啓動該Activity是從onCreate開始的(不會調用onSaveInstanceState()方法)。Home鍵默認是stop前臺的Activity即狀態爲onStop爲止,而不是Destroy,若再次啓動它,會調用onSaveInstanceState() 方法,保持上次Activity的狀態則是從OnRestart開始的---->onStart()--->onResume()。

5. 如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?onSaveInstanceState()
當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上了參數savedInstanceState;而沒被收回的就直接執行onRestart()->onStart()->onResume(),跳過onCreate()了。

6. 你後臺的Activity被系統回收怎麼辦:onSaveInstanceState 
當你的程序中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B,這個時候A會執行 
Java代碼   
public void onSaveInstanceState(Bundle outState) {    
super.onSaveInstanceState(outState);    
outState.putLong("id", 1234567890);

B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上參數savedInstanceState,沒被收回的就還是onResume就好了。 
savedInstanceState是一個Bundle對象,你基本上可以把他理解爲系統幫你維護的一個Map對象。在onCreate()裏你可能會用到它,如果正常啓動onCreate就不會有它,所以用的時候要判斷一下是否爲空。 
Java代碼 
if(savedInstanceState != null){     
long id = savedInstanceState.getLong("id");

就像官方的Notepad教程裏的情況,你正在編輯某一個note,突然被中斷,那麼就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不需要保存什麼,比如你的界面就是讀取一個列表,那就不需要特殊記住什麼,哦, 沒準你需要記住滾動條的位置(滾動條的位置如何記住?)...

7. 怎樣關閉一個Activity;怎樣關閉一個Application?
ActivityManager activityMgr= (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
activityMgr.restartPackage(getPackageName());
最後還需要添加這個權限才行:
<!-- 關閉應用程序的權限 -->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />

8. 橫豎屏切換的生命週期

9. Activity棧
   上面提到開發者是無法控制Activity的狀態的,那Activity的狀態又是按照何種邏輯來運作的呢?這就要知道 Activity 棧。
每個Activity的狀態是由它在Activity棧(是一個後進先出LIFO,包含所有正在運行Activity的隊列)中的位置決定的。
當一個新的Activity啓動時,當前的活動的Activity將會移到Activity棧的頂部。
如果用戶使用後退按鈕返回的話,或者前臺的Activity結束,在棧上的Activity將會移上來並變爲活動狀態。如下圖所示:

   2.JPG 

    一個應用程序的優先級是受最高優先級的Activity影響的。當決定某個應用程序是否要終結去釋放資源,Android內存管理使用棧來決定基於Activity的應用程序的優先級。
Activity狀態 
一般認爲Activity有以下四種狀態: 
活動的:當一個Activity在棧頂,它是可視的、有焦點、可接受用戶輸入的。Android試圖盡最大可能保持它活動狀態,殺死其它Activity來確保當前活動Activity有足夠的資源可使用。當另外一個Activity被激活,這個將會被暫停。 
暫停: 在很多情況下,你的Activity可視但是它沒有焦點,換句話說它被暫停了。有可能原因是一個透明或者非全屏的Activity被激活。 
當被暫停,一個Activity仍會當成活動狀態,只不過是不可以接受用戶輸入。在極特殊的情況下,Android將會殺死一個暫停的Activity來爲活動的Activity提供充足的資源。當一個Activity變爲完全隱藏,它將會變成停止。 
停止:當一個Activity不是可視的,它“停止”了。這個Activity將仍然在內存中保存它所有的狀態和會員信息。儘管如此,當其它地方需要內存時,它將是最有可能被釋放資源的。當一個Activity停止後,一個很重要的步驟是要保存數據和當前UI狀態。一旦一個Activity退出或關閉了,它將變爲待用狀態。 
待用: 在一個Activity被殺死後和被裝在前,它是待用狀態的。待用Acitivity被移除Activity棧,並且需要在顯示和可用之前重新啓動它。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章