天天看點

Android四大元件ActivityServiceBroadcastReceiverContentProvider

摘抄自https://www.jianshu.com/p/51aaa65d5d25,隻選取部分覺得需要記錄一下的内容,用于查閱

文章目錄

  • Activity
    • 生命周期圖:
    • onPause()執行相關
    • Activity生命周期異常情況
    • Activity與Fragment生命周期關系
    • Activity與menu建立先後順序
    • Activity的啟動模式
  • Service
    • 基本說明
    • 兩種啟動方式
    • IntentService
  • BroadcastReceiver
  • ContentProvider

Activity

生命周期圖:

Android四大元件ActivityServiceBroadcastReceiverContentProvider

onPause()執行相關

表示activity正在停止,此時可以做一些存儲資料,停止動畫等工作,注意不能太耗時,因為這會影響到新activity的顯示,onPause必須先執行完,新的activity的onResume才會執行。

當activity中彈出dialog對話框的時候,activity不會回調onPause。

然而當activity啟動dialog風格的activity的時候,此activity會回調onPause函數。

Activity生命周期異常情況

情況1:資源相關的系統配置發生改變導緻activity被殺死并重新建立

比如說目前activity處于豎屏狀态,如果突然旋轉螢幕,由于系統配置發生了改變,在預設情況下,activity就會被銷毀并且重新建立,當然我們也可以組織系統重新建立我們的activity。

系統配置發生改變以後,activity會銷毀,其onPause,onStop,onDestory均會被調用,由于activity是在異常情況下終止的,系統會調用onSaveInstance來儲存目前activity狀态,這個方法的調用時機是在onStop之前。與onPause沒有既定的時序關系,當activity重新建立後,系統會調用onRestoreInstanceState,并且把activity銷毀時onSaveInstanceState方法儲存的Bundle對象作為參數同時傳遞給onRestoreInstanceState和onCreate方法。onRestoreInstanceState()在onStart()方法後回調。

Android四大元件ActivityServiceBroadcastReceiverContentProvider
Android四大元件ActivityServiceBroadcastReceiverContentProvider

同時,在onSaveInstanceState和onRestoreInstanceState方法中,系統自動為我們做了一些恢複工作,如:文本框(EditeText)中使用者輸入的資料,ListView滾動的位置等,這些view相關的狀态系統都能夠預設為我們恢複。可以檢視view源碼,和activity一樣,每個view都有onSaveInstanceState方法和onRestoreInstanceState方法。

情況2:資源記憶體不足導緻低優先級的activity被殺死

這裡的情況和前面的情況1資料存儲和恢複是完全一緻的,activity按照優先級從高到低可以分為如下三種:

(1)前台activity—正在和使用者互動的activity,優先級最高

(2)可見但非前台activity—比如activity中彈出了一個對話框,導緻activity可見但是位于背景無法和使用者直接互動。

(3)背景activity—已經被暫停的activity,比如執行了onStop,優先級最低。

重新建立activity:activity指定configChange屬性來不讓系統重新建立activity。

android : configChanges = “orientation”

Activity與Fragment生命周期關系

建立

Android四大元件ActivityServiceBroadcastReceiverContentProvider

銷毀

Android四大元件ActivityServiceBroadcastReceiverContentProvider

Activity與menu建立先後順序

在activity建立完回調onResume後建立menu,回調onCreateOptionsMenu

Activity的啟動模式

tandard模式:在這種模式下,activity預設會進入啟動它的activity所屬的任務棧中。 注意:在非activity類型的context(如ApplicationContext)并沒有所謂的任務棧,是以不能通過ApplicationContext去啟動standard模式的activity。

singleTop模式:棧頂複用模式。如果新activity位于任務棧的棧頂的時候,activity不會被重新建立,同時它的onNewIntent方法會被回調。 注意:這個activity的onCreate,onStart,onResume不會被回調,因為他們并沒有發生改變。

singleTask模式:棧内複用模式。隻要activity在一個棧中存在,那麼多次啟動此activity不會被重新建立單例,系統會回調onNewIntent。

singleInstance模式:單執行個體模式。預設情況下,所有activity所需的任務棧的名字為應用的包名,可以通過給activity指定TaskAffinity屬性來指定任務棧,這個屬性值不能和包名相同,否則就沒有意義 。

Service

基本說明

調用者和service在同一個程序裡,是以運作在主程序的main線程中。是以不能進行耗時操作,可以采用在service裡面建立一個Thread來執行任務。任何 Activity 都可以控制同一 Service,而系統也隻會建立一個對應 Service 的執行個體。

兩種啟動方式

第一種:start

不在使用時,調用stopService(Intent)方法停止服務

使用start方式啟動的生命周期:

onCreate() – > onStartCommand() – > onDestory()

注意:如果服務已經開啟,不會重複回調onCreate()方法,如果再次調用context.startService()方法,service而是會調用onStart()或者onStartCommand()方法。

特點:

一旦服務開啟就跟調用者(開啟者)沒有任何關系了。開啟者退出了,開啟者挂了,服務還在背景長期的運作,開啟者不能調用服務裡面的方法。

第二種:bind

不再使用時,調用unbindService(ServiceConnection)方法停止該服務

使用這種bind方式啟動的service的生命周期如下:

onCreate() – > onBind() --> onUnbind() – > onDestory()

注意:綁定服務不會調用onStart()或者onStartCommand()方法

特點:bind的方式開啟服務,綁定服務,調用者挂了,服務也會跟着挂掉。綁定者可以調用服務裡面的方法。

IntentService

IntentService是Service的子類,比普通的Service增加了額外的功能。先看Service本身存在兩個問題:

Service不會專門啟動一條單獨的程序,Service與它所在應用位于同一個程序中;

Service也不是專門一條新線程,是以不應該在Service中直接處理耗時的任務;

IntentService特征:

會建立獨立的worker線程來處理所有的Intent請求;

會建立獨立的worker線程來處理onHandleIntent()方法實作的代碼,無需處理多線程問題;

所有請求處理完成後,IntentService會自動停止,無需調用stopSelf() 方法停止Service;

為Service的onBind()提供預設實作,傳回null;

為Service的onStartCommand提供預設實作,将請求Intent添加到隊列中;

Github: ServiceDemo

BroadcastReceiver

普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能将處理結果傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優先級别(聲明在intent-filter元素的android:priority屬性中,數越大優先級别越高,取值範圍:-1000到1000。也可以調用IntentFilter對象的setPriority()進行設定),被接收者依次接收廣播。

注意 :BroadcastReceiver生命周期很短

不應該在BroadcastReceiver中開啟一個新的線程,因為BroadcastReceiver生命周期很短,在執行完onReceiver以後就結束,如果開啟一個新的線程,可能出現BroadcastRecevier退出以後線程還在,而如果BroadcastReceiver所在的程序結束了,該線程就會被标記為一個空線程,根據Android的記憶體管理政策,在系統記憶體緊張的時候,會按照優先級,結束優先級低的線程,而空線程無異是優先級最低的,這樣就可能導緻BroadcastReceiver啟動的子線程不能執行完成。

廣播還可以通過動态注冊,一定要加上這個權限

android:name=“android.permission.PROCESS_OUTGOING_CALLS”

ContentProvider

它主要的作用就是将程式的内部的資料和外部進行共享,為資料提供外部通路接口,被通路的資料主要以資料庫的形式存在,而且還可以選擇共享哪一部分的資料。ContentProvider是android中一種跨程式共享資料的重要元件。

也可以使用系統的ContentProvider。系統的ContentProvider有很多,如通話記錄,短信,通訊錄等等,都需要和第三方的app進行共享資料。既然是使用系統的,那麼ContentProvider的具體實作就不需要我們擔心了。