Android面試基礎(三)——四大組件的介紹

談談對Android四大組件的認識

一、Activity 

二、Service 

三、Broadcast Receiver 

四、Content Provider 

 

一、Activity 活動

 

  • 使用activity需要在AndroidManifest.xml中註冊
  • onCreate(Bundle):在此方法中做一些初始化操作,初始化activity、setContentView(int)加載佈局、控件的初始化等(findViewById(int))

  • onStart():可見不可操作,顯示界面

  • onResume():可見可操作,此時的activity處於棧頂位置用戶可以愉快的玩耍了

  • onPause():可見不可交互,此時界面沒有獲取焦點(如在activity中彈出dialog、設備休眠也可從onresume()進入到 onPause()狀態),官方建議在這裏保存狀態信息(數據),通常用contentprovider來保存

  • onStop():不可見,被覆蓋或最小化

  • onDestroy():銷燬前調用的最後一個方法,可在此做一些解綁、資源回收等操作

  • onRestart():重新返回,下一個調用的是onStart()方法
    當activity被強制回收了,在被殺死前會調用onSaveInstanceState(Bundle)方法,可以在此保存一些有用的信息

 

一個 Activity 的啓動順序:
onCreate()——>onStart()——>onResume()

當AActivity啓動BActivity的生命週期

A -> onPause()

B ->onCreate(),onStart(),onResume()

此時B才完全覆蓋A

這時A->onStop()


 

2.BroadcastReceiver 廣播接收者

Broadcast是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件。

註冊BroadcastReceiver有兩種方式:

靜態註冊

 

AndroidManifest.xml中用標籤註冊,並在標籤內用標籤設置過濾器。

 <receiver android:name="myRecevice">    //繼承BroadcastReceiver,重寫onReceiver方法

    <intent-filter>    

      <action android:name="com.dragon.net"></action> //使用過濾器,接收指定action廣播

      </intent-filter>

  </receiver> 

動態註冊


一般:在onStart中註冊,onStop中取消unregisterReceiver

 IntentFilter intentFilter = new IntentFilter();
   intentFilter.addAction(String);   //爲BroadcastReceiver指定action,使之用於接收同action的廣播
    registerReceiver(BroadcastReceiver,intentFilter);//註冊
  Intent intent = new Intent(actionString);//指定廣播Action:
  intent.putExtra("msg", "我通過廣播發送消息了");//通過Intent攜帶消息 
  Context.sendBroadcast(intent );//發送廣播消息

BroadcastReceiver的兩種常用類型 

  • 標準廣播:是一種完全異步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎同時都會在同一時刻受到這條廣播消息,這種廣播的效率比較高,但同時也意味着它是無法被截斷的
  • 有序廣播:是一個同步執行的廣播,廣播發出後,同一時刻只有一個廣播接收器能夠受到這條廣播消息,當這個廣播接收器中的邏輯執行完畢後,廣播纔會繼續傳遞。所有此時的廣播接收器是有先後順序的,優先級高的先受到廣播,並且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣後面的廣播接收器就無法接收到廣播消息了
     

在標準廣播下兩種註冊方式的比較

(1)兩種註冊方式均不設置優先級

未設置優先級的情況下,先動態後靜態

(2)將動態優先級設置爲最低-1000,靜態優先級設置爲最高1000

動態仍先於靜態被接收到

在有序廣播下兩種註冊方式比較

靜態廣播1(優先級爲200),靜態廣播2(優先級爲300),靜態廣播3(優先級爲400),靜態廣播優先級爲(-100),動態廣播優先級爲0。

出現順序由優先級決定,由高到低分別爲靜態3-靜態2-靜態1-動-靜態。

總結兩種註冊方式特點

廣播接收器註冊一共有兩種形式:靜態註冊和動態註冊.

兩者及其接收廣播的區別:

(1)動態註冊廣播不是常駐型廣播,也就是說廣播跟隨Activity的生命週期。注意在Activity結束前,移除廣播接收器。

靜態註冊是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。

(2)當廣播爲有序廣播時:優先級高的先接收(不分靜態和動態)。同優先級的廣播接收器,動態優先於靜態

(3)同優先級的同類廣播接收器,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後註冊的。

(4)當廣播爲默認廣播時:無視優先級,動態廣播接收器優先於靜態廣播接收器。同優先級的同類廣播接收器,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後冊的。
 

3. Service 後臺服務

service 可以在和多場合的應用中使用,比如播放多媒體的時候用戶啓動了
其他 Activity 這個時候程序要在後臺繼續播放,比如檢測 SD 卡上文件的變化,
再或者在後臺記錄你地理信息位置的改變等等,總之服務嘛,總是藏在後頭的。


Service 是在一段不定的時間運行在後臺,不和用戶交互應用組件。


Service 和其他的應用組件一樣,運行在進程的主線程中。這就是說如果
service 需要很多耗時或者阻塞的操作,需要在其子線程中實現


service 的兩種啓動模式模式

採用Context.startService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。


採用Context.bindService()方法啓動服務,在服務未被創建時,系統會先調用服務的 onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方 法,接着調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致 多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用 unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。 
 

請描述一下 Service 的生命週期

Service 有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不同的使用方法生命週期
方法也不同。
非 綁 定 模 式 : 當 第 一 次 調 用 startService 的 時 候 執 行 的 方 法 依 次 爲 onCreate() 、
onStartCommand(),當 Service 關閉的時候調用 onDestory 方法。
綁定模式:第一次 bindService()的時候,執行的方法爲 onCreate()、onBind()解除綁定的
時候會執行 onUnbind()、onDestory()。
上面的兩種生命週期是在相對單純的模式下的情形。我們在開發的過程中還必須注意 Service 實
例只會有一個,也就是說如果當前要啓動的 Service 已經存在了那麼就不會再次創建該 Service 當然
也不會調用 onCreate()方法。
一個 Service 可以被多個客戶進行綁定,只有所有的綁定對象都執行了 onBind()方法後該
Service 纔會銷燬,不過如果有一個客戶執行了 onStart()方法,那麼這個時候如果所有的 bind 客戶
都執行了 unBind()該 Service 也不會銷燬。
 

4.ContentProvider 內容提供者

ContentProvider管理android以結構化方式存放的數據。他以相對安全的方式封裝數據並且提供簡易的處理機制。Content provider提供不同進程間數據交互的標準化接口。保證被訪問數據的安全性。內容提供器可以選擇只對哪一部分數據進行共享,從而保證我們程序中的隱私數據不會有泄漏的風險。

android 中對數據操作包含有:
file, sqlite3, Preferences, ContectResolver 與 ContentProvider 前三
種數據操作方式都只是針對本應用內數據,程序不能通過這三種方法去操作別的
應用內的數據。
android 中提供 ContectResolver 與 ContentProvider 來操作別的應用程序
的數據。


使用方式:


一個應用實現 ContentProvider 來提供內容給別的應用來操作,
一個應用通過 ContentResolver 來操作別的應用數據,當然在自己的應用中
也可以

1.ContentProvider


Android 提供了一些主要數據類型的 ContentProvider,比如音頻、視頻、
圖片和私人通訊錄等。可在 android.provider 包下面找到一些 Android 提供的
ContentProvider。通過獲得這些 ContentProvider 可以查詢它們包含的數據,
當然前提是已獲得適當的讀取權限。


2.ContentResolver


當外部應用需要對 ContentProvider 中的數據進行添加、刪除、修改和查詢
操作時,可以使用 ContentResolver 類來完成,要獲取 ContentResolver 對象,
可以使用 Context 提供的 getContentResolver()方法。


3.Uri


Uri 指定了將要操作的 ContentProvider,其實可以把一個 Uri 看作是一個
網址,我們把 Uri 分爲三部分。
第一部分是"content://"。可以看作是網址中的"http://"。
第二部分是主機名或 authority,用於唯一標識這個 ContentProvider,外
部應用需要根據這個標識來找到它。可以看作是網址中的主機名,比如
"blog.csdn.net"。
第三部分是路徑名,用來表示將要操作的數據。可以看作網址中細分的內容
路徑
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章