Activit系列之---Activity的生命周期
Activity的生命周期
Hello,巴友們好,小菜我又來(lái)發(fā)博文啦。上篇文章給大家簡(jiǎn)單的介紹了一下Activity,以及如何創(chuàng)建一個(gè)最簡(jiǎn)單的Activity并且在上面顯示hello android!
我們知道要?jiǎng)?chuàng)建一個(gè)自己的Activity就必須繼承Activity這個(gè)類,并且實(shí)現(xiàn)它的回調(diào)方法,以便Activity在本身的生命周期中的兩個(gè)不同狀態(tài)切換時(shí)供系統(tǒng)調(diào)用。
那什么是Activity的生命周期呢?Activity的生命周期有哪些呢?什么時(shí)回調(diào)方法呢?今天我們就來(lái)回答這3個(gè)問(wèn)題。
首先我們先看看google官方給出的Activity生命周期的圖。
這張圖中包含了Activity的所有生命周期,已經(jīng)它們改變時(shí)的條件。
Activity的生命周期包括:
這7個(gè)方法就是Activity的生命周期,也是回調(diào)方法。為什么這么說(shuō)呢?我們?cè)诹私釧ctivity的生命周期時(shí)一定要有一個(gè)這樣的概念:“是操作系統(tǒng)在調(diào)用我們,而不是我們?cè)谡{(diào)用操作系統(tǒng)”也就是說(shuō)操作系統(tǒng)已經(jīng)定義好了Activity的各種生命狀態(tài)的點(diǎn),我們要做的只是在不同的生命周期完成不同的操作就可以了。就了這個(gè)概念就不難理解為什么這7個(gè)方法又稱為回調(diào)方法了。
? 那這些方法是什么時(shí)候被系統(tǒng)調(diào)用?又是什么時(shí)候結(jié)束的呢?
從上圖中我們可以看見(jiàn),activity啟動(dòng)之后,就會(huì)運(yùn)行:
OnCreate()-àonStart()-àonResume()方法
當(dāng)另外一個(gè)Activity被啟動(dòng)時(shí),舊的Activity會(huì)調(diào)用:
OnPause()-àonStop()方法
這時(shí)候舊的Activity會(huì)繼續(xù)在后臺(tái)運(yùn)行,除非系統(tǒng)資源不夠用了,操作系統(tǒng)才會(huì)銷毀這些不可見(jiàn)的Activity.
如果舊的Activity重新開(kāi)始在前臺(tái)運(yùn)行就會(huì)調(diào)用:
OnRestart()-àonStart()-àonResume()方法
直到退出該Activity才會(huì)調(diào)用:onDestroy()方法。
現(xiàn)在我們就對(duì)這7個(gè)方法的運(yùn)行條件進(jìn)行單個(gè)的分析。
以上就是Activity生命周期的詳細(xì)描述。
? 咱們的大詩(shī)人陸游說(shuō)的好:” 紙上得來(lái)終覺(jué)淺 絕知此事要躬行”。接下來(lái)咱們就一起動(dòng)手,去驗(yàn)證一下Activity的生命周期。
? 首先先建立一個(gè)android project 取名為Activity_02.
創(chuàng)建一個(gè)Activity叫ActivityLifeCycle.在這個(gè)Activity中我們?nèi)?shí)現(xiàn)這7個(gè)回調(diào)方法。并在這7個(gè)方法中打印一句話。
1 package edu.activity.viking.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class ActivityLifeCycle extends Activity 7 { 8 /** Called when the activity is first created. */ 9 @Override 10 public void onCreate(Bundle savedInstanceState) 11 { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.main); 14 System.out.println("run onCreate"); 15 } 16 17 18 @Override 19 protected void onStart() 20 { 21 System.out.println("run onStart"); 22 super.onStart(); 23 } 24 25 26 @Override 27 protected void onRestart() 28 { 29 System.out.println("run onRestart"); 30 super.onRestart(); 31 } 32 33 @Override 34 protected void onResume() 35 { 36 System.out.println("run onResume"); 37 super.onResume(); 38 } 39 40 41 @Override 42 protected void onPause() 43 { 44 System.out.println("run onPause"); 45 super.onPause(); 46 } 47 48 @Override 49 protected void onStop() 50 { 51 System.out.println("run onStop"); 52 super.onStop(); 53 } 54 55 @Override 56 protected void onDestroy() 57 { 58 System.out.println("run onDestroy"); 59 super.onDestroy(); 60 } 61 }現(xiàn)在我們啟動(dòng)Activity看看控制臺(tái)輸出的信息。
我們可以看到在Activity啟動(dòng)的過(guò)程中,系統(tǒng)調(diào)用了
OnCreate()-àonStart()-àonResume()
三個(gè)方法。
我們現(xiàn)在按Back鍵退出,看看會(huì)運(yùn)行什么。
我可以看到當(dāng)我們退出Activity時(shí)系統(tǒng)調(diào)用了
OnPause()-àonStop()-àonDestroy()
三個(gè)方法。
?
接下來(lái)我們測(cè)試另外一種情況。我們需要在我們的Activity_02這個(gè)項(xiàng)目中再添加一個(gè)Activity,名叫:OtherActivity當(dāng)然它也必須繼承咱們的Activity
我們把新建立的OtherActivity也實(shí)現(xiàn)這7個(gè)方法并且打印一句話。
1 package edu.activity.viking.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class OtherActivity extends Activity 7 { 8 @Override 9 protected void onCreate(Bundle savedInstanceState) 10 { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.other_activity); 13 System.out.println("OtherActivity onCreate"); 14 } 15 16 @Override 17 protected void onStart() 18 { 19 System.out.println("OtherActivity onStart"); 20 super.onStart(); 21 } 22 23 @Override 24 protected void onRestart() 25 { 26 System.out.println("OtherActivity onRestart"); 27 super.onRestart(); 28 } 29 30 @Override 31 protected void onResume() 32 { 33 System.out.println("OtherActivity onResume"); 34 super.onResume(); 35 } 36 37 @Override 38 protected void onPause() 39 { 40 System.out.println("OtherActivity onPause"); 41 super.onPause(); 42 } 43 44 @Override 45 protected void onStop() 46 { 47 System.out.println("OtherActivity onStop"); 48 super.onStop(); 49 } 50 51 @Override 52 protected void onDestroy() 53 { 54 System.out.println("OtherActivity onDestroy"); 55 super.onDestroy(); 56 } 57 }在onCreate方法中,我們使用了setContentView方法,這個(gè)方法指明我們要顯示other_activity.xml文件。Other_activity.xml文件內(nèi)容很簡(jiǎn)單。只有一個(gè)TextView控件顯示一句話。
代碼:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" 6 > 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="other_activity" 11 /> 12 </LinearLayout>然后我們必須修改ActivityLifeCycle文件。以下是修改好的代碼。
1 package edu.activity.viking.test; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class ActivityLifeCycle extends Activity 10 { 11 /** Called when the activity is first created. */ 12 @Override 13 public void onCreate(Bundle savedInstanceState) 14 { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.main); 17 System.out.println("run onCreate"); 18 //通過(guò)findViewById這個(gè)方法從other_activity.xml中找到一個(gè)Button 19 Button button = (Button)findViewById(R.id.button); 20 //為按鈕注冊(cè)監(jiān)聽(tīng)器 21 button.setOnClickListener(new View.OnClickListener() 22 { 23 24 public void onClick(View v) 25 { 26 Intent intent = new Intent(); 27 intent.setClass(ActivityLifeCycle.this, OtherActivity.class); 28 ActivityLifeCycle.this.startActivity(intent); 29 } 30 31 }); 32 } 33 34 35 @Override 36 protected void onStart() 37 { 38 System.out.println("run onStart"); 39 super.onStart(); 40 } 41 42 43 @Override 44 protected void onRestart() 45 { 46 System.out.println("run onRestart"); 47 super.onRestart(); 48 } 49 50 @Override 51 protected void onResume() 52 { 53 System.out.println("run onResume"); 54 super.onResume(); 55 } 56 57 58 @Override 59 protected void onPause() 60 { 61 System.out.println("run onPause"); 62 super.onPause(); 63 } 64 65 @Override 66 protected void onStop() 67 { 68 System.out.println("run onStop"); 69 super.onStop(); 70 } 71 72 @Override 73 protected void onDestroy() 74 { 75 System.out.println("run onDestroy"); 76 super.onDestroy(); 77 } 78 }本次的修改集中在onCreate方法中。
最后必須把新建立的OtherActivity在androidManifest.xml中進(jìn)行注冊(cè),否則系統(tǒng)會(huì)報(bào)錯(cuò)噢。
到目前為止,我們的修改就完成了,我們?cè)龠\(yùn)行一下,看看控制臺(tái)給出的信息。
程序運(yùn)行后,同樣是先執(zhí)行ActivityLifeCycle中的onCreate-onStart-onResume方法。
我們點(diǎn)擊OtherActivity按鈕。
從圖中我們可以看到,點(diǎn)擊OtherActivity按鈕后,舊的Activity立即執(zhí)行了onPause方法,接著新的Activity執(zhí)行了onCreate-àonStart-àonResume方法。當(dāng)新的Activity變?yōu)榭梢?jiàn)狀態(tài)時(shí),舊的Activity執(zhí)行了onStop方法。
? 這時(shí)我們?cè)侔碽ack鍵,讓新的Activity結(jié)束運(yùn)行,讓舊的Activity重新回到前臺(tái)。
?
按back鍵后,新的Activity執(zhí)行了onPause方法,接著舊的Activity執(zhí)行了onRestart-àonStart-àonResume方法,這里值得注意的是,它并沒(méi)有調(diào)用onCreate方法,而是執(zhí)行了onRestart方法,這也證明了舊的Activity被新的Activity遮擋住以后,并沒(méi)有被銷毀掉,而是一直存在。所以當(dāng)舊的Activity重新在前臺(tái)運(yùn)行時(shí)只調(diào)用onRestart方法而不會(huì)調(diào)用onCreate方法。
? 當(dāng)舊的Activity為可見(jiàn)狀態(tài)時(shí),新的Activity調(diào)用了onStop-àonDestroy方法。也就是說(shuō)新的Activity被銷毀掉了。
? 如果這時(shí)候我們?cè)侔匆淮蝏ack鍵,舊的Activity也將會(huì)被銷毀掉。
?
?
這時(shí)舊的activity就會(huì)執(zhí)行onPause-àonStop-àonDestroy方法。
這種情況弄明白以后,我們就來(lái)說(shuō)說(shuō),當(dāng)新啟動(dòng)的Activity沒(méi)有完全充滿屏幕的情況,看看是否與上面解釋的一樣。那么我們?cè)趺床拍茏屝聠?dòng)的Activity不充滿屏幕呢?很簡(jiǎn)單,只需要在AndroidManifest.xml中的<activity>標(biāo)簽中添加一個(gè)屬性即可。看圖:
添加完這個(gè)屬性后,我們?cè)賮?lái)看看運(yùn)行的情況如何。
首次運(yùn)行程序,還是調(diào)用onCreate-àonStart-àonResume方法。
點(diǎn)擊OtherActivity按鈕。
?
看,這次新的Activity并沒(méi)有充滿整個(gè)屏幕,所以舊的Activity只是調(diào)用了onPause方法,并沒(méi)有調(diào)用onStop方法。
咱們按back鍵,回到上一個(gè)Activity.
當(dāng)舊的Activity重新運(yùn)行以后,果然只是調(diào)用了onResume方法。
再次點(diǎn)擊back鍵。我們看到了這時(shí)候新的Activity才會(huì)調(diào)用onStop方法和onDestroy方法。為什么會(huì)這樣呢?這一點(diǎn)小菜我也不是很明白,小菜猜想也許在第一次點(diǎn)擊back鍵時(shí),對(duì)話框式的activity只是被隱藏起來(lái)了,并沒(méi)有被舊的Activity覆蓋。所以并沒(méi)有調(diào)用onStop和onDestroy方法。當(dāng)然這都只是小菜個(gè)人的猜想,如果有大牛知道答案的,麻煩告訴小菜一聲。省得小菜誤人子弟了。
“這篇文章好長(zhǎng)啊,我都快看不下去了”。沒(méi)關(guān)系最后一個(gè)知識(shí)點(diǎn)了,大家再堅(jiān)持一會(huì)。
?? 最后的一個(gè)是不同的退出方式,不同的進(jìn)入方式對(duì)Activity生命周期的影響。
以上總結(jié)了2種不同方式退出,2種不同方式進(jìn)入Activity的情況。按Home鍵退出時(shí)起始Activity并沒(méi)有銷毀掉,也就是說(shuō)并沒(méi)有調(diào)用onDestroy方法。所以再2種不同的方式進(jìn)入時(shí),它依然時(shí)從onRestart方法開(kāi)始運(yùn)行。
? 而按back鍵退出時(shí),Activity是被銷毀掉了的,當(dāng)以2種不同的方式再次運(yùn)行時(shí),Activity會(huì)從onCreate方法開(kāi)始運(yùn)行。
? 由于寫(xiě)的太多了,已經(jīng)有人開(kāi)始扔丑雞蛋了,我就不給大家做示范了,大家自己動(dòng)手實(shí)驗(yàn)一下,看看是不是我所說(shuō)的這樣。
?好啦,好啦終于寫(xiě)完了,好長(zhǎng)啊,沒(méi)想到寫(xiě)了這么多。那么再見(jiàn)啦,下一篇博文咱們繼續(xù)深入Activity.
轉(zhuǎn)載于:https://www.cnblogs.com/zzy0127/archive/2012/09/05/2672104.html
總結(jié)
以上是生活随笔為你收集整理的Activit系列之---Activity的生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Flex与javascript通信
- 下一篇: 动手写了一个12306插件 chrome