Android 組件詳講

大家好,這是我寫的第一篇技術文章,寫得不好,請各位諒解,小生會繼續努力的!


首先,Android 重要組件包括:Activity(活動)、Service(服務)、Content Provider(數據源組件)、Broadcast Receiver(廣播接收器)

Activity - 活動

活動是程序與用戶交互的窗口,是 Android 構造中最基本的一種。

它的功能就是:

1、構造界面;

作爲用戶交互的窗口,活動可用來構造界面,使用 setContentView() 方法可以將相關資源信息設置到內容區域中。

同時可以在活動中找到 layout 中的各種控件,可在活動中動態設置控件的內容等。

2、處理交互事件;

活動可處理用戶與程序的交互事件,通過設置控件的監聽來實現具體的交互。

它需要爲保持各界面的狀態,做很多持久化的事情。

每當一個新活動開始,以前的活動已停止,但系統會保持活動堆棧(“回棧”)。


Activity 生命週期:

圖就不畫了,搜索一下成堆。我就主要講一下要點好了。生命週期不能亂用,一定要用到點上。以下是我的總結:

1、onCreate()    - 主要使用初始化操作;

2、onStart()   - 主要是用於保持顯示給用戶 UI 數據和資源;

3、onResume()  - 一般用於數據恢復的操作;

4、onPause()  - 用於保存數據;

5、onDestroy()  - 用於釋放資源。


注意:要生命週期方法要相對應來實現

onCreate()     對應  onDestroy() ;

onStart()         對應  onStop() ;

onResume() 對應  onPause() ;


Service - 服務:

Android爲了屏蔽進程的概念,利用不同的組件[Activity、Service]來表示進程之間的通信。

服務是運行在後臺的,它既不是進程,也不是線程,它是 Android 的一個組件,它沒有界面。服務適用於長時間運行的應用功能。

可用於進程間通信,服務它可分爲:本地服務、遠程服務(AIDL),關於 AIDL 後續文章裏會講到。

注:服務它本身是在主線程中執行的,所以一般要開闢一個新線程。

有個好用的服務叫 IntentService, 它裏面建立了有一個子線程。所以使用它就不必開啓新線程了。

使用 IntentService 一般搭配的是廣播,一個任務執行完,通過廣播發送給活動來更新界面等。


服務的生命週期:

圖也不畫了,說個要點,

服務它有個混淆的概念就是: onBind()  和  onStartConmand()。

服務開始,會執行 onCreate() 跟活動一樣方法只執行一次。每次 startService() 都會執行 onStartConmand() 方法。

使用服務的 onBind() 方法,可返回一個 Binder  ,可實現個內部類提供 Service 給外部訪問,外部就可以執行服務中的方法了。

[java] view plaincopy
  1. // 實例化 binder  
  2. private IBinder binder = new LocalBinder();  
  3.   
  4. // 定義 binder  
  5. class LocalBinder extends Binder{  
  6.         MyService1 getService(){  
  7.             Log.d(TAG, "LocalBinder");  
  8.             return MyService1.this;  
  9.         }  
  10.     }  
  11.   
  12.   
  13. // 返回一個 binder  
  14. @Override  
  15.     public IBinder onBind(Intent intent) {  
  16.         Log.d(TAG, "onBind");  
  17.         return binder;  
  18.     }  


Content Provider - 數據源組件:

數據源組件並不包含特定的功能邏輯,而是負責爲應用提供數據訪問的接口。

它是 Android 第三方應用數據的訪問方案,例如:你要訪問手機中的聯繫人就需要通過數據源組件來訪問。

它對外提供數據,實現它 需要重寫六個方法: onCreate、query、getType、insert、delete、update

getType 是獲得類型,MIME 類型 , 如果是目錄則返回:  "vnd.android.cursor.dir/" + PATH  , 如果是具體內容則返回: "vnd.android.cursor.item/" + PATH

其他就像數據庫操作一樣,不用多講。

使用它的好處就是可以屏蔽內部數據的存儲細節,向外提供統一的接口模型。這樣外部訪問時,就直接使用 ContentResolver 來訪問。


Broadcast Receiver - 廣播接收器:

廣播接收器接收一種或多種 Intent 作觸發的事件,它用於監聽各種系統或系統中其他應用發生的事件,做出響應。

它的註冊,可分爲動態註冊和靜態註冊,所謂動態就是通過 Context.registerReceiver 來註冊,通過 Context.unregisterReceiver 來解除註冊;

而靜態註冊就是講廣播接收器的相關信息寫在配置文件中。

靜態註冊這種方式的註冊不是常駐型的,也就是說當應用關閉後,如果有廣播信息傳來,Receiver也會被系統調用而自動運行。

動態註冊是常駐型,也是常用的方式,但注意,有註冊就一定要有解除註冊。不然會有系統異常。


以上四個重要組件,除了接收器可以動態註冊以外,其他三個都必須在配置文件中註冊。

同時要注意的是:所有組件都是在主線程中運行的,所以如果有耗時操作,一定要開闢新線程來執行,不然會 ANR 。

Service 的話,如果是執行簡單的事情,可使用 IntentService - 這個裏面已經提供了子線程,所以就不需要開闢線程了,能夠更方便的使用。

但是要注意的就是 IntentService 的生命週期跟普通 Service 的生命週期不同。

發佈了20 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章