android 學習教程五—- 四大組件之一Activity 詳解

來源:互聯網
上載者:User

 

Android四大基本組件分別是Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。

 

本章主要涉及一下知識點:

 一. Activity的生命週期及應用情境:
二 . 讓Activity變成一個視窗:Activity屬性設定
三 你背景Activity被系統 回收怎麼辦:onSaveInstanceState

一 Activity的生命週期 :

  

  Android的應用程式 的生命週期是被統一掌控 的,也就是說我們寫的應用程式命運掌握在別人(系統)的手裡,不能改變它,只能學習 並適應它。

   簡單地說一下為什麼是這樣:我們手機在運行 一個應用程式的時候,有可能打進來電話發進來簡訊 ,或者沒有電了,這時候程式都會被中斷,優先去服務電話的準系統 ,

    另 外系統也不允許你佔用太多資源 ,至少要保證電話功能吧,所以資源不足的時候也就有可 能被幹掉。

                                                               

                                                                                             activity生命週期圖

 

 

四大狀態:

一般來講,某一時刻,Activity處在下面四個狀態之一:

Active:當Activity運行在螢幕前台,此時它擷取了焦點能響應使用者的操作,屬於運行狀態,同一個時刻只會有一個Activity 處於活動(Active)或運行。

Paused:當Activity失去焦點但仍對使用者可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等快顯視窗時)它處於暫停狀態。暫停Activity仍然是存活狀態(它保留著所

               有的狀態和成員資訊並保持和視窗管理器的串連),但是當系統記憶體極小時可以被系統殺掉。

Stopped:完全被另一個Activity遮擋時處於停止狀態,它仍然保留著所有的狀態和成員資訊。只是對使用者不可見,當其他地方需要記憶體時它往往被系統殺掉,但是以                通 過 notification進行通訊。

Dead:Activity 尚未被啟動、已經被手動終止,或已經被系統回收時處於非活動的狀態,要手動終止Activity,可以在程式中調用"finish"方法。例如為了釋放緊缺的記憶體空間。

 

狀態轉變的事件:

當狀態改變時,Android會提供1個或者多個觸發調用方法。我們通過重寫這些方法來實現我們的處理。

public class MyActivity extends Activity{

     protected void onCreate(Bundle savedInstanceState){….. }

     protected void onStart(){….. }
     
     protected void onRestart(){….. }

     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(Bundle savedInstanceState) :通常用於初始化設定: 1、為Activity設定所要使用的布局檔案2、為按鈕綁定監聽器等靜態設定作業

 onStart() :當Activity可見未獲得使用者焦點不能互動時系統會調用

 onRestart() : 當Activity已經停止然後重新被啟動時系統會調用

 onResume(): 當Activity可見且獲得使用者焦點能互動時系統會調用

   onPause():  應該使用onPause()來儲存持久資料。

                    當系統啟動另外一個新的Activity時,在新Activity啟動之前被系統調用儲存現有的Activity中的持久資料、停止動畫等,這個實現方法必須非常快。當系統而不是使用者自己出於回收記憶體時,關閉了activity 之後。使用者會期望當他再次回到這個activity 的時候,它仍保持著上次離開時的樣子。此時用到了onSaveInstanceState(),方法onSaveInstanceState()用來儲存Activity被殺之前的狀態,在onPause()之前被觸發,當系統為了節省記憶體銷毀了Activity(使用者本不想銷毀)時就需要重寫這個方法了,當此Activity再次被執行個體化時會通過onCreate(Bundle
savedInstanceState)將已經儲存的臨時狀態資料傳入因為onSaveInstanceState()方法不總是被調用,觸發條件為(按下HOME鍵,按下電源按鍵關閉螢幕,橫豎屏切換情況下),你應該僅重寫onSaveInstanceState()來記錄activity的臨時狀態,而不是持久的資料。應該使用onPause()來儲存持久資料。

 onStop():當Activity被新的Activity完全覆蓋不可見時被系統調用

onDestroy():當Activity(使用者調用finish()或系統由於記憶體不足)被系統銷毀殺掉時系統調用,(整個生命週期只調用1次)用來釋放onCreate ()方法中建立的資源,如結束線程等

 

生命週期情境例子:

   一下例子參用愷風 哥們的:

情境1:如果我們在一個activity(activity1)中通過intent啟動另一個activity(activity2),那麼觸發的過程是:

activity1-onPause()->activity2-onCreate()->activity2-onStart()->activity2-onResume()->activity1-onStop()

activity1:失去了使用者的焦點,無法和使用者進行互動,被activity2覆蓋,調用了onPause(),然後是activity2的啟動調用過程,通常activity2不是覆蓋部分,而且完全佔據螢幕,由此activity1被隱藏,activity1進入了Stopped狀態,調用activity1-onStop()。如果acvity2已對話方塊的方式,而不是全螢幕,即activity1不會並因此,仍然保留在Paused狀態,則不會觸發activity1-onStop()。

activity2:對於一個activity的啟動順序為初始化onCreate() -> 使用者可視onStart() -> 使用者可互動(獲得焦點)onResume()

 

情境2:我們按菜單的返回鍵,從activity2退出,並恢複為activity1

activity2-onPause() -> activity1-onRestart() -> activity1-onStart() -> activity1-onResume() ->
activity2-onStop() -> activity2-onDestory()

activity1:在情境1中進入Stopped狀態,重新恢複,進入onRestart()狀態,UI可視onStart(),獲得焦點使用者可互動onResume()

activity2:按返回鍵,acivity將被登出,根據android給出來的圖,依次進行onPause()失去焦點不可互動->onStop()不可視->on Destory()被關閉。

 

二 . 讓Activity變成一個視窗:Activity屬性設定

           簡單你只需要設定 一下Activity的主題就可以了在AndroidManifest.xml 中定義  :比如一個漂浮在手機主介面等

 

Xml代碼

android :theme="@android:style/Theme.Dialog"

android:theme="@android:style/Theme.Dialog"

這就使你的應用程式變成對話方塊的形式彈出來了,或者

Xml代碼

android:theme="@android:style/Theme.Translucent"

android:theme="@android:style/Theme.Translucent"

就變成半透明的,

上面說的是屬性名稱,具體有什麼值是在android.R.style中 可以看到,比如這個"@android:style/Theme.Dialog" 就對應於android.R.style.Theme_Dialog

 

三  .你背景Activity被系統回收怎麼辦:onSaveInstanceState

   儲存資料的方式為onSaveInstanceState(),要注意,由於activity會頻繁地執行之,所以一定要保證高效,只將我們的data存放如Bundle。擷取資料有兩個途徑,一是onCreate(Bundle)中的參數攜帶該data,二是在onRestoreInstanceState()。我們可以選擇所需的資料,這個資料甚至可以是一個callback

當你的程式中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B

這個時候A會執行

Java代碼
public
void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState);  
    outState.putLong("id", 11111111111);  
}  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.