ContentProvider ,Service


一、ContentProvider

1.ContentPriovider 是什麼?
    1)Android 中核心應用組件(Component)之一
   2)Android 中的內容提供者?

2.ContentProvider 應用場合?
   ContentProvider 對象實現了APP內部數據的對外(可能是本進程的其它組件,
也可能是跨進程的組件)共享。
   例如:
   1)手機聯繫人數據對外共享。
   2)手機相冊中數據對外共享。
   3).......

3.ContentProvider 應用的構成分析?
   1)Data(要對外共享的數據)
   2)ContentProvider對象(是對外共享)
   3)URI(統一資源標識,用於標識具體資源)
   4)ContentResolver對象(可以簡單理解爲ContentProvider的客戶端對象)

4.ContentProvider 應用的具體實現?
   1)ContentProvider 端的實現(暫且理解爲服務端):數據提供端
      a)數據(Data)
      b)編寫ContentProvider(直接或間接繼承ContentProvider類)
      c)註冊ContentProvider(AndroidManifest.xml)

   2)ContentResolver 端的實現(暫且理解爲客戶端):數據訪問端
      a)獲得Context對象
      b)獲得ContentResolver對象
      c)獲得要訪問的ContentProvider端的URI
      d)執行ContentResolver對象的相關方法進行數據處理。

      說明:ContentResovler對象方法中的方法名與ContentProvider端對象的方法基本是一致的,當我們執行ContentResolver對象的某個方法時,底層會根據方法名及參數設置訪問ContentProvider端對應的方法。

    重點掌握ContentProvider的訪問流程,瞭解ContentProvider對象方法的構建。


5.訪問Android系統提供的ContentProvider?(重點)

   1)訪問系統提供的媒體信息(音頻,視頻,圖片)
   2)訪問系統提供的聯繫人信息

   步驟:
   1)獲得ContentResovler
   2)獲得URI(Media,Phone,....)
   3)執行查詢(query(.....))

6.CursorLoader 在異步訪問provider中的應用?

   CursorLoader 底層默認採用異步加載機制訪問數據,並可以對數據提供緩存機制,以提供對數據的訪問效率。假如在Activity中要訪問ContentProvider中提供的數據,建議使用CursorLoader.

   CursorLoader 對象的應用步驟:

      1)獲得LoaderManager(getLoaderManager())
      2)初始化CursorLoader (初始化的同時註冊一個回調監聽對象LoaderCallbacks)
      3)執行監聽對象中的相關方法?
         a)onCreateLoader (初始化loader時執行)
         b)onLoadFinished (數據加載完成執行)
         c)onLoaderReset (loader重置或銷燬時執行)

7.ContentProvider 應用FAQ?

   1)ContentProvider 對象應用場合?(應用數據對外共享,例如微信訪問聯繫人數據)
   2)ContentProvider 對象應用優勢?(提供了對數據的統一訪問方式)
   3)ContentProvider 對象對外共享數據的格式?(數據庫,文件assert,....)
   4)ContentResovler 對象的作用?(是ContentProvider對外的一個窗口)
   5)URI 是什麼,在ContentProvider應用中充當的角色?(統一資源標識,用於標識ContentProvider資源)
   6)CursorLoader 應用優勢?(異步加載,防內存泄露,數據緩存,便於管理)

//======================================================


二Service 組件

1.Service 是什麼?

   1)Android 中核心應用組件(生命週期方法).
   2)Android 中的Context(資源訪問能力)
   3)Android 中的應用服務(此服務不能呈現view,工作於後臺)


2.Service 應用場合?

   Service 通常用於執行一些"長時間"的後臺耗時操作(這些耗時操作也是要啓動工作線程的),例如下載,音樂的播放等.

FAQ?

   Serivce 中啓動工作線程執行長時間耗時操作相對於Activity啓動
   工作線程執行長時間耗時操作有什麼優勢?

   Service 服務所在的進程運行在後臺執行長時間的耗操作時生命力更加頑強。


Android 中進程的類型及生命力(如下由高到低)?
   1)前臺進程(正在於用戶交互的進程):生命力最頑強,不允許被kill.
      a)有activity正在前臺運行(正在與用戶交互)
      b)有通知(Notification)綁定了正在運行的service
   2)可見進程(進程可見,但不可操作)
   3)服務進程(有service正在後臺運行,且進程不可見)
   4)後臺進程(後臺沒有service運行,前臺又沒有可見組件在運行)
   5)空進程(沒有任何組件的進程)

   Android 系統在內存不足時會選擇一些優先級比較低的進程執行kill操作。

3.Service 的應用類型?

   1) 啓動模式的Service.
   2) 綁定模式的Service.
   3) 混合模式的Service.

4.Service 應用的構建?

   1)創建Service (直接或間接的繼承Service)
   2)註冊Service (在AndroidManifest.xml中進行註冊)
   3)啓動或綁定service(startService,bindService,.....)
   4)在Service對象相關生命週期方法中執行業務。

5.Service 啓動模式的應用?

   Service 啓動模式相關操作:

   1)創建Service,重寫相關方法
   2)註冊Service (AndroidManifest.xml)
   3)啓動Service:startService(intent)
   4)停止Service:stopService(Intent)

啓動模式Service的生命週期方法:

   1)onCreate():第一次啓動時執行
   2)onStartCommand:每次啓動都會執行
   3)onDestory():service 銷燬時執行

啓動模式Service中onStartCommand方法的返回值:
   1)START_STICKY (表示service被非正常kill以後會自動重啓)
   2)START_STICKY_COMPATIBILITY(是START_STICKY 的一個兼容模式,但進程被非正常kill以後不保證能重新啓動service)
   3)START_NOT_STICKY(表示service被非正常kill以後不會重啓service)
   4)START_REDELIVER_INTENT(表示service被非正常kill以後會自動重啓,並且會重新傳遞intent);

啓動模式Service中onStartCommand方法的參數:
   1)intent (用於值傳遞)
   2)flags(表示service的啓動方式,例如intent是否是重寫傳遞的)
   3)startId(表示第幾次啓動的service,後續可以通過stopSelf(startId)停止service)

6.IntentService 在啓動模式中的應用?

   IntentService 主要應用於啓動模式,此對象在啓動以後會自動創建一個工作線程(HandlerThread),我們可以在此工作線程中執行耗時操作,此耗時操作執行完成,Service會自動關閉。

   在構建IntentService 應用時,我們需要構建此類的一個子類類型,然後重寫onHandleIntent方法(此方法運行在工作線程),在此方法中執行我們的業務處理就可以了。


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