精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

帶你了解Android四大基本組件

移動開發 Android
Android四大基本組件分別是Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。本文將帶領各位一起認識一下他們。

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

一、了解四大基本組件

Activity :

應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽并處理用戶的事件做出響應。

Activity之間通過Intent進行通信。在Intent 的描述結構中,有兩個最重要的部分:動作和動作對應的數據。

典型的動作類型有:M AIN(activity的門戶)、VIEW、PICK、EDIT 等。而動作對應的數據則以URI 的形式進行表示。例如:要查看一個人的聯系方式,你需要創建一個動作類型為VIEW 的intent,以及一個表示這個人的URI。

與之有關系的一個類叫IntentFilter。相對于intent 是一個有效的做某事的請求,一個intentfilter 則用于描述一個activity(或者IntentReceiver)能夠操作哪些intent。一個activity 如果要顯示一個人的聯系方式時,需要聲明一個IntentFilter,這個IntentFilter 要知道怎么去處理VIEW 動作和表示一個人的URI。IntentFilter 需要在AndroidManifest.xml 中定義。通過解析各種intent,從一個屏幕導航到另一個屏幕是很簡單的。當向前導航時,activity 將會調用startActivity(Intent myIntent)方法。然后,系統會在所有安裝的應用程序中定義的IntentFilter 中查找,找到最匹配myIntent 的Intent 對應的activity。新的activity 接收到myIntent 的通知后,開始運行。當startActivity 方法被調用將觸發解析myIntent 的動作,這個機制提供了兩個關鍵好處:

A、Activities 能夠重復利用從其它組件中以Intent 的形式產生的一個請求;

B、Activities 可以在任何時候被一個具有相同IntentFilter 的新的Activity 取代。

AndroidManifest文件中含有如下過濾器的Activity組件為默認啟動類當程序啟動時系統自動調用它

BroadcastReceive廣播接收器:

你的應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收并做出響應。廣播接收器沒有用戶界面。 然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager 來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它并獲取消 息。

廣播類型:

普通廣播,通過Context.sendBroadcast(Intent myIntent)發送的

有序廣播,通過Context.sendOrderedBroadcast(intent, receiverPermission)發送的,該方法第2個參數決定該廣播的級別,級別數值是在 -1000 到 1000 之間 , 值越大 , 發送的優先級越高;廣播接收者接收廣播時的級別級別(可通過intentfilter中的priority進行設置設為2147483647時優先級最 高),同級別接收的先后是隨機的, 再到級別低的收到廣播,高級別的或同級別先接收到廣播的可以通過abortBroadcast()方法截斷廣播使其他的接收者無法收到該廣播,還有其他構 造函數

異步廣播,通過Context.sendStickyBroadcast(Intent myIntent)發送的,還有sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)方法,該方法具有有序廣播的特性也有異步廣播的特性;發送異步廣播要: 權限,接收并處理完Intent后,廣播依然存在,直到你調用removeStickyBroadcast(intent)主動把它去掉

注意:發送廣播時的intent參數與Contex.startActivity()啟動起來的Intent不同,前者可以被多個訂閱它的廣播接收器調用,后者只能被一個(Activity或service)調用

監聽廣播Intent步驟:

1> 寫一個繼承BroadCastReceiver的類,重寫onReceive()方法,廣播接收器僅在它執行這個方法時處于活躍狀態。當 onReceive()返回后,它即為失活狀態,注意:為了保證用戶交互過程的流暢,一些費時的操作要放到線程里,如類名 SMSBroadcastReceiver

2> 注冊該廣播接收者,注冊有兩種方法程序動態注冊和AndroidManifest文件中進行靜態注冊(可理解為系統中注冊)如下:

動態注冊,一般在Activity可交互時onResume()內注冊BroadcastReceiver

 

  1. IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
  2. registerReceiver(mBatteryInfoReceiver ,intentFilter); 
  3.  
  4. //反注冊 
  5. unregisterReceiver(receiver); 

注意:

1.生命周期只有十秒左右,如果在 onReceive() 內做超過十秒內的事情,就會報ANR(Application No Response) 程序無響應的錯誤信息,如果需要完成一項比較耗時的工作 , 應該通過發送 Intent 給 Service, 由Service 來完成 . 這里不能使用子線程來解決 , 因為 BroadcastReceiver 的生命周期很短 , 子線程可能還沒有結束BroadcastReceiver 就先結束了 .BroadcastReceiver 一旦結束 , 此時 BroadcastReceiver 的所在進程很容易在系統需要內存時被優先殺死 , 因為它屬于空進程 ( 沒有任何活動組件的進程 ). 如果它的宿主進程被殺死 , 那么正在工作的子線程也會被殺死 . 所以采用子線程來解決是不可靠的

  1. 動態注冊廣播接收器還有一個特點,就是當用來注冊的Activity關掉后,廣播也就失效了。靜態注冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用

系統常見廣播Intent,如開機啟動、電池電量變化、時間改變等廣播

Service 服務:

一個Service 是一段長生命周期的,沒有用戶界面的程序,可以用來開發如監控類程序。

比較好的一個例子就是一個正在從播放列表中播放歌曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個activity,讓使用者可以選擇歌曲 并播放歌曲。然而,音樂重放這個功能并沒有對應的activity,因為使用者當然會認為在導航到其它屏幕時音樂應該還在播放的。在這個例子中,媒體播放 器這個activity 會使用Context.startService()來啟動一個service,從而可以在后臺保持音樂的播放。同時,系統也將保持這個service 一直執行,直到這個service 運行結束。另外,我們還可以通過使用Context.bindService()方法,連接到一個service 上(如果這個service 還沒有運行將啟動它)。當連接到一個service 之后,我們還可以service 提供的接口與它進行通訊。拿媒體播放器這個例子來說,我們還可以進行暫停、重播等操作。

Service使用步驟如下

1
2
3
4
5
   1>繼承service類

   2>AndroidManifast.xml配置清單文件中<application>節點里對服務進行配置

          <service name=".SMSService"/>

服務不能自己運行,需要通過Contex.startService()或Contex.bindService()啟動服務

通過startService()方法啟動的服務于調用者沒有關系,即使調用者關閉了,服務仍然運行想停止服務要調用 Context.stopService(),此時系統會調用onDestory(),使用此方法啟動時,服務首次啟動系統先調用服務的 onCreate()-->onStart(),如果服務已經啟動再次調用只會觸發onStart()方法

使用bindService()啟動的服務與調用者綁定,只要調用者關閉服務就終止,使用此方法啟動時,服務首次啟動系統先調用服務的 onCreate()-->onBind(),如果服務已經啟動再次調用不會再觸發這2個方法,調用者退出時系統會調用服務的 onUnbind()-->onDestory(),想主動解除綁定可使用Contex.unbindService(),系統依次調用 onUnbind()-->onDestory();

Content Provider內容提供者 :

android平臺提供了Content Provider使一個應用程序的指定數據集提供給其他應用程序。這些數據可以存儲在文件系統中、在一個SQLite數據庫、或以任何其他合理的方式,

其他應用可以通過ContentResolver類(見ContentProviderAccessApp例子)從該內容提供者中獲取或存入數據.(相當于在應用外包了一層殼),

只有需要在多個應用程序間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中

它的好處:統一數據訪問方式。

android系統自帶的內容提供者(頂級的表示數據庫名,非頂級的都是表名)這些內容提供者在SDK文檔的android.provider Java包中都有介紹。見:http://developer.android.com/reference/android/provider/package-summary.html

├────Browser

├────CallLog

├────Contacts

│ ├────Groups

│ ├────People

│ ├────Phones

│ └────Photos

├────Images

│ └────Thumbnails

├────MediaStore

│ ├────Albums

│ ├────Artists

│ ├────Audio

│ ├────Genres

│ └────Playlists

├────Settings

└────Video

CallLog:地址和接收到的電話信息

Contact.People.Phones:存儲電話號碼

Setting.System:系統設置和偏好設置

使用Content Provider對外共享數據的步驟

1>繼承ContentProvider類并根據需求重寫以下方法:
public boolean onCreate();//處理初始化操作

  1. /** 
  2.     * 插入數據到內容提供者(允許其他應用向你的應用中插入數據時重寫) 
  3.     * @param uri 
  4.     * @param initialValues 插入的數據 
  5.     * @return 
  6.     */ 
  7.    public Uri insert(Uri uri, ContentValues initialValues); 
  8.  
  9.    /** 
  10.     * 從內容提供者中刪除數據(允許其他應用刪除你應用的數據時重寫) 
  11.     * @param uri 
  12.     * @param selection 條件語句 
  13.     * @param selectionArgs 參數 
  14.     * @return 
  15.     */ 
  16.    public int delete(Uri uri, String selection, String[] selectionArgs); 
  17.  
  18.    /** 
  19.     * 更新內容提供者已存在的數據(允許其他應用更新你應用的數據時重寫) 
  20.     * @param uri 
  21.     * @param values 更新的數據 
  22.     * @param selection 條件語句 
  23.     * @param selectionArgs 參數 
  24.     * @return 
  25.     */ 
  26.    public int update(Uri uri, ContentValues values, String selection, 
  27.                  String[] selectionArgs); 
  28.  
  29.    /** 
  30.     * 返回數據給調用者(允許其他應用從你的應用中獲取數據時重寫) 
  31.     * @param uri 
  32.     * @param projection 列名 
  33.     * @param selection 條件語句 
  34.     * @param selectionArgs 參數 
  35.     * @param sortOrder 排序 
  36.     * @return 
  37.     */ 
  38.    public Cursor query(Uri uri, String[] projection, String selection, 
  39.                  String[] selectionArgs, String sortOrder) ;          
  40.  
  41.    /** 
  42.     * 用于返回當前Uri所代表數據的MIME類型 
  43.     * 如果操作的數據為集合類型(多條數據),那么返回的類型字符串應該為vnd.android.cursor.dir/開頭 
  44.     * 例如要得到所有person記錄的Uri為content://com.bravestarr.provider.personprovider/person, 

*   那么返回的MIME類型字符串應該為"vnd.android.cursor.dir/person"
* 如果操作的數據為單一數據,那么返回的類型字符串應該為vnd.android.cursor.item/開頭
* 例如要得到id為10的person記錄的Uri為content://com.bravestarr.provider.personprovider/person/10,
*   那么返回的MIME類型字符串應該為"vnd.android.cursor.item/person"
* @param uri
*/
public String getType(Uri uri)

這些方法中的Uri參數,得到后需要進行解析然后做對應處理,Uri表示要操作的數據,包含兩部分信息:

  1. 1.需要操作的contentprovider 
  2.  
  3. 2.對contentprovider中的什么數據進行操作,一個Uri格式:結構頭://authorities(域名)/路徑(要操作的數據,根據業務而定) 
  4.  
  5.           content://com.bravestarr.provider.personprovider/person/10 

說明:contentprovider的結構頭已經由android規定為content://

authorities用于唯一標識這個contentprovider程序,外部調用者可以根據這個找到他

路徑表示我們要操作的數據,路徑的構建根據業務而定.路徑格式如下:

1
2
3
   要操作person表行號為10的記錄,可以這樣構建/person/10

   要操作person表的所有記錄,可以這樣構建/person

2>在AndroidManifest.xml中使用對ContentProvider進行配置注冊(內容提供者注冊它自己就像網站注冊域名),ContentProvider采用authoritie(原意授權,可理解為域名)作為唯一標識,方便其他應用能找到

關于四大基本組件的一個總結:

1) 4大組件的注冊

4大基本組件都需要注冊才能使用,每個Activity、service、Content Provider內容提供者都需要在AndroidManifest文件中進行配置AndroidManifest文件中未進行聲明的activity、 服務以及內容提供者將不為系統所見,從而也就不可用,而BroadcastReceive廣播接收者的注冊分靜態注冊(在AndroidManifest 文件中進行配置)和通過代碼動態創建并以調用Context.registerReceiver()的方式注冊至系統。需要注意的是在 AndroidManifest文件中進行配置的廣播接收者會隨系統的啟動而一直處于活躍狀態,只要接收到感興趣的廣播就會觸發(即使程序未運行)

AndroidManifest文件中進行注冊格式如下:

元素的name 屬性指定了實現了這個activity 的Activity 的子類。icon 和label 屬性指向了包含展示給用戶的此activity 的圖標和標簽的資源文件。

元素用于聲明服務

元素用于聲明廣播接收器

元素用于聲明內容提供者

2) 4大組件的激活

• 容提供者的激活:當接收到ContentResolver 發出的請求后,內容提供者被激活。而其它三種組件──activity、服務和廣播接收器被一種叫做intent 的異步消息所激活

• Activity的激活通過傳遞一個Intent 對象至Context.startActivity()或Activity.startActivityForResult()以載入(或指定新工作給) 一個activity。相應的activity 可以通過調用getIntent() 方法來查看激活它的intent。如果它期望它所啟動的那個activity 返回一個結果,它會以調用startActivityForResult()來取代startActivity()。比如說,如果它啟動了另外一個 Activity 以使用戶挑選一張照片,它也許想知道哪張照片被選中了。結果將會被封裝在一個Intent 對象中,并傳遞給發出調用的activity 的onActivityResult() 方法。

• 服務的激活可以通過傳遞一個Intent 對象至Context.startService()或Context.bindService()前者Android 調用服務的onStart()方法并將Intent 對象傳遞給它,后者Android 調用服務的onBind()方法將這個Intent 對象傳遞給它

• 發送廣播可以通過傳遞一個Intent 對象至給Context.sendBroadcast() 、

Context.sendOrderedBroadcast()或Context.sendStickyBroadcast()Android 會調用所有對此廣播有興趣的廣播接收器的onReceive()方法,將intent 傳遞給它們

3) 四大組件的關閉

內容提供者僅在響應ContentResolver 提出請求的時候激活。而一個廣播接收器僅在響應廣播信息的時候激活。所以,沒有必要去顯式的關閉這些組件。

Activity關閉:可以通過調用它的finish()方法來關閉一個activity

服務關閉:對于通過startService()方法啟動的服務要調用Context.stopService()方法關閉服務,使用bindService()方法啟動的服務要調用Contex.unbindService ()方法關閉服務

二、四大組件的生命周期

1
 介紹生命周期之前,先提一下任務的概念

任務其實就是activity 的棧它由一個或多個Activity組成的共同完成一個完整的用戶體驗, 換句話說任務就是” 應用程序” (可以是一個也可以是多個,比如假設你想讓用戶看到某個地方的街道地圖。而已經存在一個具有此功能的activity 了,那么你的activity 所需要做的工作就是把請求信息放到一個Intent 對象里面,并把它傳遞給startActivity()。于是地圖瀏覽器就會顯示那個地圖。而當用戶按下BACK 鍵的時候,你的activity 又會再一次的顯示在屏幕上,此時任務是由2個應用程序中的相關activity組成的)棧底的是啟動整個任務的Activity,棧頂的是當前運行的用戶 可以交互的Activity,當一個activity 啟動另外一個的時候,新的activity 就被壓入棧,并成為當前運行的activity。而前一個activity 仍保持在棧之中。當用戶按下BACK 鍵的時候,當前activity 出棧,而前一個恢復為當前運行的activity。棧中保存的其實是對象,棧中的Activity 永遠不會重排,只會壓入或彈出,所以如果發生了諸如需要多個地圖瀏覽器的情況,就會使得一個任務中出現多個同一Activity 子類的實例同時存在。

任務中的所有activity 是作為一個整體進行移動的。整個的任務(即activity 棧)可以移到前臺,或退至后臺。舉個例子說,比如當前任務在棧中存有四個activity──三個在當前activity 之下。當用戶按下HOME 鍵的時候,回到了應用程序加載器,然后選擇了一個新的應用程序(也就是一個新任務)。則當前任務遁入后臺,而新任務的根activity 顯示出來。然后,過了一小會兒,用戶再次回到了應用程序加載器而又選擇了前一個應用程序(上一個任務)。于是那個任務,帶著它棧中所有的四個 activity,再一次的到了前臺。當用戶按下BACK 鍵的時候,屏幕不會顯示出用戶剛才離開的activity(上一個任務的根

activity)。取而代之,當前任務的棧中最上面的activity 被彈出,而同一任務中的上一個activity 顯示了出來。

Activity棧:先進后出規則

Android系統是一個多任務(Multi-Task)的操作系統,可以在用手機聽音樂的同時,也執行其他多個程序。每多執行一個應用程序,就會多耗費一些系統內存,當同時執行的程序過多,或是關閉的程序沒有正確釋放掉內存,系統就會覺得越來越慢,甚至不穩定。

為了解決這個問題, Android 引入了一個新的機制-- 生命周期(Life Cycle)。

Android 應用程序的生命周期是由Android 框架進行管理,而不是由應用程序直接控

制。通常,每一個應用程序(入口一般會是一個Activity 的onCreate 方法),都會產生

一個進程(Process)。當系統內存即將不足的時候,會依照優先級自動進行進程(process)的回收。不管是使用者或開發者, 都無法確定的應用程序何時會被回收。所以為了很好的防止數據丟失和其他問題,了解生命周期很重要。

Activity生命周期:

圖3.1activity生命周期圖

Activity整個生命周期的4種狀態、7個重要方法和3個嵌套循環

1> 四種狀態
1. 活動(Active/Running)狀態

當Activity運行在屏幕前臺(處于當前任務活動棧的最上面),此時它獲取了焦點能響應用戶的操作,屬于運行狀態,同一個時刻只會有一個Activity 處于活動(Active)或運行

(Running)狀態
1. 暫停(Paused)狀態

當Activity失去焦點但仍對用戶可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等彈出窗口時)它處于 暫停狀態。暫停的Activity仍然是存活狀態(它保留著所有的狀態和成員信息并保持和窗口管理器的連接),但是當系統內存極小時可以被系統殺掉

  1. 停止(Stopped)狀態

完全被另一個Activity遮擋時處于停止狀態,它仍然保留著所有的狀態和成員信息。只是對用戶不可見,當其他地方需要內存時它往往被系統殺掉

  1. 非活動(Dead)狀態

Activity 尚未被啟動、已經被手動終止,或已經被系統回收時處于非活動的狀態,要手動終止Activity,可以在程序中調用"finish"方法。

如果是(按根據內存不足時的回收規則)被系統回收,可能是因為內存不足了

內存不足時,Dalvak 虛擬機會根據其內存回收規則來回收內存:

1
  1. 先回收與其他Activity 或Service/Intent Receiver 無關的進程(即優先回收獨

立的Activity)因此建議,我們的一些(耗時)后臺操作,最好是作成Service的形式

1
2
3
4
5
6
7
  2.不可見(處于Stopped狀態的)Activity

  3.Service進程(除非真的沒有內存可用時會被銷毀)

  4.非活動的可見的(Paused狀態的)Activity

  5.當前正在運行(Active/Running狀態的)Activity

2> 7個重要方法,當Activity從一種狀態進入另一狀態時系統會自動調用下面相應的方

法來通知用戶這種變化

當Activity第一次被實例化的時候系統會調用,

整個生命周期只調用1次這個方法

通常用于初始化設置: 1、為Activity設置所要使用的布局文件2、為按鈕綁定監聽器等靜態的設置操作

1
  onCreate(Bundle savedInstanceState);

當Activity可見未獲得用戶焦點不能交互時系統會調用

1
  onStart();

當Activity已經停止然后重新被啟動時系統會調用

1
  onRestart();

當Activity可見且獲得用戶焦點能交互時系統會調用

1
  onResume();

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

1
  onPause();

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

1
  onStop();

當Activity(用戶調用finish()或系統由于內存不足)被系統銷毀殺掉時系統調用,(整個生命周期只調用1次)用來釋放onCreate ()方法中創建的資源,如結束線程等

1
  onDestroy();

3> 3個嵌套循環

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
         1.Activity完整的生命周期:從第一次調用onCreate()開始直到調用onDestroy()結束

         2.Activity的可視生命周期:從調用onStart()到相應的調用onStop()

                在這兩個方法之間,可以保持顯示Activity所需要的資源。如在onStart()中注冊一個廣播接收者監聽影響你的UI的改變,在onStop() 中注銷。

         3.Activity的前臺生命周期:從調用onResume()到相應的調用onPause()。



  舉例說明:

例1:有3個Acitivity,分別用One,Two(透明的),Three表示,One是應用啟動時的主Activity

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  啟動第一個界面Activity One時,它的次序是

         onCreate (ONE) - onStart (ONE) - onResume(ONE)

  點"打開透明Activity"按鈕時,這時走的次序是

         onPause(ONE) - onCreate(TWO) - onStart(TWO) - onResume(TWO)

  再點back回到第一個界面,Two會被殺這時走的次序是

         onPause(TWO) - onActivityResult(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO)

  點"打開全屏Activity"按鈕時,這時走的次序是

         onPause(ONE) - onCreate(Three) - onStart(Three) - onResume(Three) - onStop(ONE)

  再點back回到第一個界面,Three會被殺這時走的次序是

         onPause(Three) - onActivityResult(ONE) - onRestart(ONE) - onStart(ONE)- onResume(ONE) - onStop(Three) - onDestroy(Three)

  再點back退出應用時,它的次序是

         onPause(ONE) - onStop(ONE) - onDestroy(ONE)           

例2:橫豎屏切換時候Activity的生命周期

他切換時具體的生命周期是怎么樣的:

1、新建一個Activity,并把各個生命周期打印出來

2、運行Activity,得到如下信息

onCreate-->
onStart-->
onResume-->

3、按crtl+f12切換成橫屏時

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

4、再按crtl+f12切換成豎屏時,發現打印了兩次相同的log

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

5、修改AndroidManifest.xml,把該Activity添加android:configChanges="orientation",執行步驟3

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

6、再執行步驟4,發現不會再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged-->

7、把步驟5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",執行步驟3,就只打印onConfigChanged

onConfigurationChanged-->

8、執行步驟4

onConfigurationChanged-->
onConfigurationChanged-->

總結:

1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次

3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

總結一下整個Activity的生命周期

補充一點,當前Activity產生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變

Activity運行時按下HOME鍵(跟被完全覆蓋是一樣的):onSaveInstanceState --> onPause --> onStop,再次進入激活狀態時: onRestart -->onStart--->onResume

BroadcastReceive廣播接收器生命周期:

生命周期只有十秒左右,如果在 onReceive() 內做超過十秒內的事情,就會報ANR(Application No Response) 程序無響應的錯誤信息

它的生命周期為從回調onReceive()方法開始到該方法返回結果后結束

Service服務生命周期:

Service完整的生命周期:從調用onCreate()開始直到調用onDestroy()結束

Service有兩種使用方法:

1>以調用Context.startService()啟動,而以調用Context.stopService()結束

2>以調用Context.bindService()方法建立,以調用Context.unbindService()關閉

service重要的生命周期方法

當用戶調用startService ()或bindService()時,Service第一次被實例化的時候系統會調用,整個生命周期只調用1次這個方法,通常用于初始化設置。注意:多次 調用startService()或bindService()方法不會多次觸發onCreate()方法

void onCreate()

當用戶調用stopService()或unbindService()來停止服務時被系統調用,(整個生命周期只調用1次)用來釋放onCreate()方法中創建的資源

void onDestroy()

通過startService()方法啟動的服務

1
  初始化結束后系統會調用該方法,用于處理傳遞給startService()的Intent對象。如音樂服務會打開Intent 來探明將要播放哪首音樂,并開始播放。注意:多次調用startService()方法會多次觸發onStart()方法

void onStart(Intent intent)

通過bindService ()方法啟動的服務

1
  初始化結束后系統會調用該方法,用來綁定傳遞給bindService 的Intent 的對象。注意:多次調用bindService()時,如果該服務已啟動則不會再觸發此方法

IBinder onBind(Intent intent)

用戶調用unbindService()時系統調用此方法,Intent 對象同樣傳遞給該方法

boolean onUnbind(Intent intent)

如果有新的客戶端連接至該服務,只有當舊的調用onUnbind()后,新的才會調用該方法

void onRebind(Intent intent)

補充:onCreate(Bundle savedInstanceState)與onSaveInstanceState(Bundle savedInstanceState)配合使用,見如下代碼,達到顯示activity被系統殺死前的狀態

  1. @Override 
  2. public void onCreate(Bundle savedInstanceState) { 
  3. super.onCreate(savedInstanceState); 
  4. if (null != savedInstanceState) { 
  5. String userid = savedInstanceState.getString("StrUserId"); 
  6. String _uid = savedInstanceState.getString("StrUid"); 
  7. String _serverid = savedInstanceState.getString("StrServerId"); 
  8. String _servername = savedInstanceState.getString("StrServerName"); 
  9. int _rate = savedInstanceState.getInt("StrRate"); 
  10. //updateUserId(userid); 
  11. //updateUId(uid); 
  12. //updateServerId(_serverid); 
  13. //updateUserServer(servername); 
  14. //updateRate(_rate); 
  15. }
  1. @Override 
  2. protected void onSaveInstanceState(Bundle savedInstanceState) { 
  3.     super.onSaveInstanceState(savedInstanceState); 
  4.     savedInstanceState.putString("StrUserId", getUserId()); 
  5.     savedInstanceState.putString("StrUid", getUId()); 
  6.     savedInstanceState.putString("StrServerId", getServerId()); 
  7.     savedInstanceState.putString("StrServerName", getServerName()); 
  8.     savedInstanceState.putInt("StrRate", getRate()); 

引發activity摧毀和重建的其他情形

除了系統處于內存不足的原因會摧毀activity之外, 某些系統設置的改變也會導致activity的摧毀和重建. 例如改變屏幕方向(見上例), 改變設備語言設定, 鍵盤彈出等.

http://my.eoe.cn/1232036/archive/22778.html

責任編輯:閆佳明 來源: eoe.cn
相關推薦

2016-12-09 09:23:50

android組件Service

2013-01-10 14:21:24

Android開發組件Activities

2014-03-27 15:57:45

Android組件Activity

2014-07-31 10:57:15

Android組件Service

2020-02-07 18:32:36

LinuxLinux內核5.6操作系統

2010-09-28 10:09:35

DOM對象模型

2012-01-17 13:16:34

JavaSwing

2010-08-05 10:22:46

Flex效果

2010-03-04 10:01:01

Android基本組件

2015-07-17 09:50:16

Carthage優劣比較

2023-07-24 10:12:15

自動駕駛視覺

2009-02-27 13:07:00

服務器解析基本特性

2010-11-03 11:10:04

AndroidiPhone

2024-12-30 11:24:56

APMZipkinPinpoint

2011-03-21 09:01:49

CSS框架

2015-10-22 10:48:47

Android四大組件攔截

2013-01-06 10:44:43

微軟Windows 8云計算

2016-03-30 11:51:55

2013-05-20 08:56:13

2011-06-29 15:50:58

Watson危險邊緣Power7
點贊
收藏

51CTO技術棧公眾號

中文字幕在线中文字幕日亚韩一区| 国产小视频国产精品| 97在线国产视频| 亚洲 国产 欧美 日韩| 日韩av一区二| 日韩中文字在线| 动漫美女无遮挡免费| 亚洲天堂一区二区| 亚洲欧美在线高清| 精品国产一区二区三区久久久久久| 天堂а√在线中文在线新版 | 日韩女优电影在线观看| 欧美男女爱爱视频| 在线观看免费黄色| 成人av第一页| 国产欧美日韩精品专区| 国产精品成人久久| 成人av国产| 亚洲精品在线三区| 国内外成人免费在线视频| 欧美理论电影| 色综合天天狠天天透天天伊人| 日韩高清一二三区| 黄色国产在线观看| www.成人影院| 综合欧美亚洲日本| 女同一区二区| 丰满人妻一区二区三区无码av| 久久亚洲精选| 久久久这里只有精品视频| 亚洲一级理论片| 亚洲区小说区图片区qvod| 日韩视频一区二区在线观看| av视屏在线播放| 欧美黑人xx片| 亚洲免费观看高清| 免费一区二区三区在在线视频| av资源免费看| 激情综合网av| 国产美女久久精品| 国产精品xxxxxx| 亚洲女同同性videoxma| 97精品视频在线观看| 麻豆chinese极品少妇| 国产精品久久久久久影院8一贰佰| 亚洲免费成人av电影| www男人天堂| 一区二区三区亚洲变态调教大结局 | 成年人网站在线| 国产精品色哟哟| 日韩精品av一区二区三区| 亚洲 精品 综合 精品 自拍| 菠萝蜜视频在线观看一区| 亚洲在线一区二区| 国产精品久久久久久免费| 奇米一区二区三区| 国产成人精品综合| 国产主播第一页| 日韩成人午夜精品| 国产精品高潮呻吟久久av无限| 久久久黄色大片| 久久久蜜桃一区二区人| 日韩免费在线看| 狠狠狠狠狠狠狠| 日韩av电影天堂| 国产美女高潮久久白浆| 国产精品免费无遮挡| 国产尤物一区二区| 91国产在线播放| 日本韩国在线观看| 91麻豆蜜桃一区二区三区| 蜜桃狠狠色伊人亚洲综合网站| 欧美在线观看在线观看| 国产日韩亚洲欧美综合| 亚洲一区3d动漫同人无遮挡| 黄色成人在线| 亚洲国产另类av| 99福利在线观看| 电影一区电影二区| 欧美精品777| 绯色av蜜臀vs少妇| 在线成人动漫av| 色黄久久久久久| 国产a免费视频| 99精品国产在热久久| 国产精品aaaa| 国产精品探花视频| www.欧美日韩| 亚洲欧洲一区二区福利| 亚洲区欧洲区| 色婷婷综合久久久中文一区二区| 亚欧美在线观看| 日韩欧美中文字幕一区二区三区| 日韩h在线观看| а天堂中文在线资源| 午夜久久久久| 国产成人综合亚洲| 国产av无码专区亚洲av| 久久女同精品一区二区| 一区二区三区四区免费观看| 国产污视频在线播放| 欧美日韩一区二区在线视频| 精品国产一二区| japanese国产精品| 久久久久国产精品www| 夜夜爽妓女8888视频免费观看| 国产一区二区三区免费在线观看| 精品欧美日韩在线| 国产精品va在线观看视色| 香蕉乱码成人久久天堂爱免费| 亚洲无吗一区二区三区| 精品国产18久久久久久洗澡| yw.139尤物在线精品视频| 久久精品国产成人av| 国产精品亚洲第一| 日日噜噜噜噜夜夜爽亚洲精品| 国产高清在线a视频大全| 欧美日韩一二三区| 9.1成人看片| 欧美三级特黄| 成人综合国产精品| 国产中文在线| 欧美日韩国产精品一区| 成人免费黄色av| 日本欧美国产| 啪一啪鲁一鲁2019在线视频| 午夜精品无码一区二区三区| 国产精品麻豆99久久久久久| 91九色丨porny丨国产jk| 123区在线| 在线看不卡av| 在线免费观看污视频| 中文无码久久精品| 国产美女直播视频一区| 黄色片在线看| 欧美性猛交xxxx偷拍洗澡| 美女伦理水蜜桃4| 亚洲午夜精品一区二区国产| 国产精品视频导航| 国产精品一区在线看| 欧美日韩性生活视频| 亚洲最大视频网| 国内精品久久久久久久影视麻豆| 91丝袜美腿美女视频网站| 中文字幕在线播放| 在线观看免费亚洲| 中文字幕在线1| 亚洲一区久久| 九九99玖玖| 福利在线免费视频| 欧美精品一区二区三| 精品深夜av无码一区二区老年| 国产成+人+日韩+欧美+亚洲| 欧美a级黄色大片| 亚洲va欧美va人人爽成人影院| 欧美成人免费在线观看| 国产美女主播在线观看| 中文字幕亚洲一区二区va在线| 亚洲综合欧美激情| 天天射综合网视频| 亚洲xxxxx| 青草av在线| 亚洲国产精品久久久久秋霞不卡| 日本熟妇乱子伦xxxx| 91在线视频18| caoporn超碰97| 色综合久久网| 亚洲综合中文字幕在线| 欧美理论电影| 亚洲毛片在线看| 亚洲午夜无码久久久久| 国产精品麻豆网站| 超碰中文字幕在线观看| 极品裸体白嫩激情啪啪国产精品| 国产亚洲情侣一区二区无| 二区三区不卡| 日韩网站在线观看| 亚洲资源在线播放| 亚洲精品乱码久久久久久黑人 | 久久精品这里都是精品| 日本激情综合网| 一区二区三区在线观看免费| 国产免费一区二区三区| 国产精品高清乱码在线观看| www国产精品com| 国产91麻豆视频| 91官网在线免费观看| 91日韩中文字幕| 91亚洲国产成人精品一区二区三 | 国产无遮无挡120秒| 91麻豆精东视频| 亚洲精品手机在线观看| 在线成人欧美| 一区二区三区不卡在线| 精品国内亚洲2022精品成人| 国产精品久久久久久久av电影| a视频在线免费看| 亚洲女人天堂av| 国产黄a三级三级三级| 欧美性猛交xxxx黑人猛交| 搜索黄色一级片| 久久综合九色综合欧美亚洲| 日韩av加勒比| 久久久久网站| 免费的一级黄色片| 成人激情视频| 激情视频一区二区| 国产一区二区三区黄网站| 51精品国产黑色丝袜高跟鞋 | 午夜精品一区二区三区在线视频 | 亚洲欧美日韩动漫| 欧美高清视频一二三区 | 日韩欧美的一区| 在线免费a视频| 日韩欧美亚洲综合| 久久网中文字幕| 最好看的中文字幕久久| 国产免费看av| 91小视频在线免费看| 原创真实夫妻啪啪av| 日本不卡高清视频| 免费看日本毛片| 国产精品国产三级国产在线观看| 麻豆91av| 日韩三级毛片| 国内一区二区在线视频观看| 日韩欧美一级| 亚洲综合色激情五月| 国产精品蜜月aⅴ在线| 668精品在线视频| 免费在线国产视频| 久久成人精品电影| 欧美18hd| 精品国产视频在线| 在线观看美女网站大全免费| 亚洲视频自拍偷拍| 暖暖视频在线免费观看| 日韩第一页在线| 午夜18视频在线观看| 日韩一区二区三区在线视频| 一级黄色免费看| 欧美裸体一区二区三区| 中文字幕理论片| 欧美午夜精品久久久久久超碰| 成人免费毛片男人用品| 福利二区91精品bt7086| 狠狠躁夜夜躁人人爽天天高潮| 亚洲图片欧美色图| 日韩三级视频在线播放| 午夜视频在线观看一区二区三区| 久久综合色综合| 亚洲成人7777| 毛片在线免费视频| 色又黄又爽网站www久久| 亚洲不卡视频在线观看| 91久久精品一区二区| 国产成人精品777777| 日本大香伊一区二区三区| 日本三级一区二区三区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 天天爱天天做天天爽| 欧美日韩国产影片| 国产美女自慰在线观看| 亚洲成人激情视频| 四虎在线免费看| 一区二区在线视频| 午夜老司机在线观看| 麻豆乱码国产一区二区三区| 国产精品探花在线| 奇米成人av国产一区二区三区| 欧美日韩国产网站| 2022国产精品| 亚洲va久久久噜噜噜久久| 日韩欧美精品久久| 91精品天堂福利在线观看| 97在线国产视频| 日日夜夜精品视频免费| 一起操在线视频| 成人sese在线| 337p粉嫩大胆噜噜噜鲁| 给我免费播放日韩视频| 国产一区二区三区无遮挡| 香蕉视频一区| 一区二区不卡视频| 韩日成人av| 日韩av在线综合| 国内成人精品2018免费看| 久久久久久久久久影视| 91丨九色丨尤物| 久久精品在线观看视频| 亚洲国产日韩精品| 午夜久久久久久久久久影院| 制服.丝袜.亚洲.另类.中文| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 亚洲日韩欧美视频一区| 麻豆视频网站在线观看| 性欧美xxxx交| 亚洲天堂网站| 欧美h视频在线| 一个色综合网| 热久久精品免费视频| 国产精品一级黄| 国产真人做爰视频免费| 亚洲成人资源在线| 中文字幕视频在线播放| 亚洲第一精品夜夜躁人人躁| av女优在线| 97碰在线观看| 国产美女视频一区二区 | 天天干天天操天天玩| 成人sese在线| 欧美爱爱小视频| 欧美日韩一二区| 精品美女视频在线观看免费软件| 九九热精品视频国产| 成人精品一区二区三区电影| 国产专区一区二区| 欧美精品午夜| 手机免费看av网站| 国产欧美日韩视频在线观看| 国产精品xxxx喷水欧美| 欧美一级淫片007| 888av在线| 国产精品久久久久久久久久小说| 日韩欧美黄色| 在线视频国内一区二区| 亚洲AV无码国产精品午夜字幕| 一区二区三区视频免费在线观看 | 日产日韩在线亚洲欧美| 成人av综合网| 黄色a级在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 三上悠亚ssⅰn939无码播放| 亚洲国产色一区| 亚洲av永久无码国产精品久久 | 久久久www免费人成黑人精品| 欧美va天堂| 亚洲AV无码久久精品国产一区| 中文字幕一区二区三区视频| 亚洲国产无线乱码在线观看| 亚洲美女性视频| 2022成人影院| 欧美日韩精品久久| 天堂va蜜桃一区二区三区漫画版| 日韩精品无码一区二区三区久久久| 狠狠操狠狠色综合网| 五月婷中文字幕| 欧美在线影院在线视频| 少妇久久久久| 成人在线看视频| 国产欧美一区二区三区在线看蜜臀| 黄色av网站免费| 最近中文字幕mv在线一区二区三区四区 | 蜜臀91精品国产高清在线观看| 无码aⅴ精品一区二区三区浪潮 | 精品一区二区三孕妇视频| 欧美性色黄大片手机版| 国产日本在线观看| 国产精品中文字幕久久久| 久久麻豆精品| 中文字幕乱妇无码av在线| 一区二区三区产品免费精品久久75| www三级免费| 97视频在线观看视频免费视频 | 别急慢慢来1978如如2| 国产欧美日韩视频在线观看| 国产精品久久久久久久久久久久久久久久 | 久久国产剧场电影| 青青操在线视频观看| 日韩欧美一二三区| 成人观看网址| 天堂精品视频| 国产伦精品一区二区三区免费迷| 日韩一区二区三区四区在线| 精品99一区二区三区| 中文字幕色婷婷在线视频| 亚洲 国产 欧美一区| 国产剧情一区在线| 欧美一二三区视频| 色噜噜狠狠狠综合曰曰曰| 一区二区在线视频观看| 国产精品免费入口| 国产精品电影一区二区| 国产刺激高潮av| 国产v综合ⅴ日韩v欧美大片| 围产精品久久久久久久| av黄色一级片| 欧美日韩国产另类一区| av丝袜在线| 亚洲图片都市激情| 成人av在线资源网站| 亚洲一区二区三区高清视频| 久久久久久国产| 成人免费在线播放| 亚洲美女高潮久久久| 欧美网站一区二区| www.51av欧美视频| 在线观看欧美激情| 91免费观看视频| 精品国产亚洲av麻豆|