Activit系列之---Activity的生命周期
Activity的生命周期
Hello,巴友們好,小菜我又來發博文啦。上篇文章給大家簡單的介紹了一下Activity,以及如何創建一個最簡單的Activity并且在上面顯示hello android!
我們知道要創建一個自己的Activity就必須繼承Activity這個類,并且實現它的回調方法,以便Activity在本身的生命周期中的兩個不同狀態切換時供系統調用。
那什么是Activity的生命周期呢?Activity的生命周期有哪些呢?什么時回調方法呢?今天我們就來回答這3個問題。
首先我們先看看google官方給出的Activity生命周期的圖。
這張圖中包含了Activity的所有生命周期,已經它們改變時的條件。
Activity的生命周期包括:
這7個方法就是Activity的生命周期,也是回調方法。為什么這么說呢?我們在了解Activity的生命周期時一定要有一個這樣的概念:“是操作系統在調用我們,而不是我們在調用操作系統”也就是說操作系統已經定義好了Activity的各種生命狀態的點,我們要做的只是在不同的生命周期完成不同的操作就可以了。就了這個概念就不難理解為什么這7個方法又稱為回調方法了。
? 那這些方法是什么時候被系統調用?又是什么時候結束的呢?
從上圖中我們可以看見,activity啟動之后,就會運行:
OnCreate()-àonStart()-àonResume()方法
當另外一個Activity被啟動時,舊的Activity會調用:
OnPause()-àonStop()方法
這時候舊的Activity會繼續在后臺運行,除非系統資源不夠用了,操作系統才會銷毀這些不可見的Activity.
如果舊的Activity重新開始在前臺運行就會調用:
OnRestart()-àonStart()-àonResume()方法
直到退出該Activity才會調用:onDestroy()方法。
現在我們就對這7個方法的運行條件進行單個的分析。
以上就是Activity生命周期的詳細描述。
? 咱們的大詩人陸游說的好:” 紙上得來終覺淺 絕知此事要躬行”。接下來咱們就一起動手,去驗證一下Activity的生命周期。
? 首先先建立一個android project 取名為Activity_02.
創建一個Activity叫ActivityLifeCycle.在這個Activity中我們去實現這7個回調方法。并在這7個方法中打印一句話。
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 }現在我們啟動Activity看看控制臺輸出的信息。
我們可以看到在Activity啟動的過程中,系統調用了
OnCreate()-àonStart()-àonResume()
三個方法。
我們現在按Back鍵退出,看看會運行什么。
我可以看到當我們退出Activity時系統調用了
OnPause()-àonStop()-àonDestroy()
三個方法。
?
接下來我們測試另外一種情況。我們需要在我們的Activity_02這個項目中再添加一個Activity,名叫:OtherActivity當然它也必須繼承咱們的Activity
我們把新建立的OtherActivity也實現這7個方法并且打印一句話。
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方法,這個方法指明我們要顯示other_activity.xml文件。Other_activity.xml文件內容很簡單。只有一個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 //通過findViewById這個方法從other_activity.xml中找到一個Button 19 Button button = (Button)findViewById(R.id.button); 20 //為按鈕注冊監聽器 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中進行注冊,否則系統會報錯噢。
到目前為止,我們的修改就完成了,我們再運行一下,看看控制臺給出的信息。
程序運行后,同樣是先執行ActivityLifeCycle中的onCreate-onStart-onResume方法。
我們點擊OtherActivity按鈕。
從圖中我們可以看到,點擊OtherActivity按鈕后,舊的Activity立即執行了onPause方法,接著新的Activity執行了onCreate-àonStart-àonResume方法。當新的Activity變為可見狀態時,舊的Activity執行了onStop方法。
? 這時我們再按back鍵,讓新的Activity結束運行,讓舊的Activity重新回到前臺。
?
按back鍵后,新的Activity執行了onPause方法,接著舊的Activity執行了onRestart-àonStart-àonResume方法,這里值得注意的是,它并沒有調用onCreate方法,而是執行了onRestart方法,這也證明了舊的Activity被新的Activity遮擋住以后,并沒有被銷毀掉,而是一直存在。所以當舊的Activity重新在前臺運行時只調用onRestart方法而不會調用onCreate方法。
? 當舊的Activity為可見狀態時,新的Activity調用了onStop-àonDestroy方法。也就是說新的Activity被銷毀掉了。
? 如果這時候我們再按一次back鍵,舊的Activity也將會被銷毀掉。
?
?
這時舊的activity就會執行onPause-àonStop-àonDestroy方法。
這種情況弄明白以后,我們就來說說,當新啟動的Activity沒有完全充滿屏幕的情況,看看是否與上面解釋的一樣。那么我們怎么才能讓新啟動的Activity不充滿屏幕呢?很簡單,只需要在AndroidManifest.xml中的<activity>標簽中添加一個屬性即可。看圖:
添加完這個屬性后,我們再來看看運行的情況如何。
首次運行程序,還是調用onCreate-àonStart-àonResume方法。
點擊OtherActivity按鈕。
?
看,這次新的Activity并沒有充滿整個屏幕,所以舊的Activity只是調用了onPause方法,并沒有調用onStop方法。
咱們按back鍵,回到上一個Activity.
當舊的Activity重新運行以后,果然只是調用了onResume方法。
再次點擊back鍵。我們看到了這時候新的Activity才會調用onStop方法和onDestroy方法。為什么會這樣呢?這一點小菜我也不是很明白,小菜猜想也許在第一次點擊back鍵時,對話框式的activity只是被隱藏起來了,并沒有被舊的Activity覆蓋。所以并沒有調用onStop和onDestroy方法。當然這都只是小菜個人的猜想,如果有大牛知道答案的,麻煩告訴小菜一聲。省得小菜誤人子弟了。
“這篇文章好長啊,我都快看不下去了”。沒關系最后一個知識點了,大家再堅持一會。
?? 最后的一個是不同的退出方式,不同的進入方式對Activity生命周期的影響。
以上總結了2種不同方式退出,2種不同方式進入Activity的情況。按Home鍵退出時起始Activity并沒有銷毀掉,也就是說并沒有調用onDestroy方法。所以再2種不同的方式進入時,它依然時從onRestart方法開始運行。
? 而按back鍵退出時,Activity是被銷毀掉了的,當以2種不同的方式再次運行時,Activity會從onCreate方法開始運行。
? 由于寫的太多了,已經有人開始扔丑雞蛋了,我就不給大家做示范了,大家自己動手實驗一下,看看是不是我所說的這樣。
?好啦,好啦終于寫完了,好長啊,沒想到寫了這么多。那么再見啦,下一篇博文咱們繼續深入Activity.
轉載于:https://www.cnblogs.com/zzy0127/archive/2012/09/05/2672104.html
總結
以上是生活随笔為你收集整理的Activit系列之---Activity的生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex与javascript通信
- 下一篇: jquery 操作日期、星期、元素的追加