日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Activit系列之---Activity的生命周期

發布時間:2023/12/19 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Activit系列之---Activity的生命周期 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Activity的生命周期

Hello,巴友們好,小菜我又來發博文啦。上篇文章給大家簡單的介紹了一下Activity,以及如何創建一個最簡單的Activity并且在上面顯示hello android!

我們知道要創建一個自己的Activity就必須繼承Activity這個類,并且實現它的回調方法,以便Activity在本身的生命周期中的兩個不同狀態切換時供系統調用。

那什么是Activity的生命周期呢?Activity的生命周期有哪些呢?什么時回調方法呢?今天我們就來回答這3個問題。

首先我們先看看google官方給出的Activity生命周期的圖。

這張圖中包含了Activity的所有生命周期,已經它們改變時的條件。

Activity的生命周期包括:

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()
  • 這7個方法就是Activity的生命周期,也是回調方法。為什么這么說呢?我們在了解Activity的生命周期時一定要有一個這樣的概念:“是操作系統在調用我們,而不是我們在調用操作系統”也就是說操作系統已經定義好了Activity的各種生命狀態的點,我們要做的只是在不同的生命周期完成不同的操作就可以了。就了這個概念就不難理解為什么這7個方法又稱為回調方法了。

    ? 那這些方法是什么時候被系統調用?又是什么時候結束的呢?

    從上圖中我們可以看見,activity啟動之后,就會運行:

    OnCreate()-àonStart()-àonResume()方法

    當另外一個Activity被啟動時,舊的Activity會調用:

    OnPause()-àonStop()方法

    這時候舊的Activity會繼續在后臺運行,除非系統資源不夠用了,操作系統才會銷毀這些不可見的Activity.

    如果舊的Activity重新開始在前臺運行就會調用:

    OnRestart()-àonStart()-àonResume()方法

    直到退出該Activity才會調用:onDestroy()方法。

    現在我們就對這7個方法的運行條件進行單個的分析。

  • onCreate():當Activity第1次啟動時才調用。如果該Activity是第2次調用則不會運行onCreate方法,而直接運行onStart()方法。比如啟動了一個新的Activity,舊的Activity轉入了后臺,當舊的Activity在前臺再次運行時就不會再執行onCreate()方法了。由于這個特性,一般可以在onCreate()方法中初始化一些只需要初始化一次的變量,當然這都不是固定的,你可以根據你的業務需求來決定。
  • onStart():當這個Activity對用戶可見之前被調用。基本上onCreate()方法和onRestart()方法后面總是伴隨著onStart()方法,反之則不成立。
  • onResume():當Activity能夠被用戶看見的時候被調用。
  • onPause():當另外一個新的Activity啟動時,首先會調用舊的Activity的onPause()方法。值得注意的是,在Android系統中,Activity并不一定會充滿整個屏幕,這是由Activity的樣式決定的,如果新的Activity并沒有充滿整個屏幕,那么舊的Activity依然是可見的,只是背景會變為半透明。這種情況下,系統是不會調用舊Activity的onStop()方法的,并且在新的Activity結束之后只調用舊Activity的onResume()方法。還要注意的是,從API上我們可以看到在onPause(),onStop(),onDestroy()這三個狀態時進程是有可能被系統給kill掉的。在進程被系統kill掉之前onPause()是唯一保證能夠被調用的方法,因為在需要緊急釋放內存的情況下onStop(),onDestroy()方法可能不會被調用。因此我們應該在onPause()方法中保存我們的持久性數據。但是我們應該有選擇性的在onPause()方法里添加操作,因為如果onPause()方法執行的時間過長,將會影響到新Activity的啟動。導致用戶體驗下降。
  • onStop():當然大多數情況下,新的Activity總會充滿整個屏幕,這就意味著舊的Activity將不可見。當舊的Activity不可見時,就會調用onStop()方法了。
  • onRestart():當新的Activity充滿整個屏幕并且結束運行舊的Activity又在前臺重新運行,就會調用舊的Activity的onRestart()方法,前提是舊的Activity沒有被系統回收掉。
  • onDestroy():當Activity被銷毀之前調用。
  • 以上就是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的生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。