1. 程式人生 > >Android四大元件(整理相關知識點)

Android四大元件(整理相關知識點)

面試題:有使用過ContentProvider碼?能說說Android為什麼要設計ContentProvider這個元件嗎?

ContentProvider應用程式間非常通用的共享資料的一種方式,也是Android官方推薦的方式。Android中許多系統應用都使用該方式實現資料共享,比如通訊錄、簡訊等。但我遇到很多做Android開發的人都不怎麼使用它,覺得直接讀取資料庫會更簡單方便。

那麼Android搞一個內容提供者在資料和應用之間,只是為了裝高大上,故弄玄虛?我認為其設計用意在於:

  1. 封裝。對資料進行封裝,提供統一的介面,使用者完全不必關心這些資料是在DB,XML、Preferences或者網路請求來的。當專案需求要改變資料來源時,使用我們的地方完全不需要修改。
  1. 提供一種跨程序資料共享的方式。

應用程式間的資料共享還有另外的一個重要話題,就是資料更新通知機制了。因為資料是在多個應用程式中共享的,當其中一個應用程式改變了這些共享資料的時候,它有責任通知其它應用程式,讓它們知道共享資料被修改了,這樣它們就可以作相應的處理。

ContentResolver介面的notifyChange函式來通知那些註冊了監控特定URI的ContentObserver物件,使得它們可以相應地執行一些處理。ContentObserver可以通過registerContentObserver進行註冊。

既然是對外提供資料共享,那麼如何限制對方的使用呢?

android:exported屬性非常重要。這個屬性用於指示該服務是否能夠被其他應用程式元件呼叫或跟它互動。如果設定為true,則能夠被呼叫或互動,否則不能。設定為false時,只有同一個應用程式的元件或帶有相同使用者ID的應用程式才能啟動或繫結該服務。

對於需要開放的元件應設定合理的許可權,如果只需要對同一個簽名的其它應用開放content provider,則可以設定signature級別的許可權。大家可以參考一下系統自帶應用的程式碼,自定義了signature級別的permission:

        <permission android:name="com.android.gallery3d.filtershow.permission.READ"
                    android:protectionLevel="signature" />

        <permission android:name
="com.android.gallery3d.filtershow.permission.WRITE" android:protectionLevel="signature" />
<provider android:name="com.android.gallery3d.filtershow.provider.SharedImageProvider" android:authorities="com.android.gallery3d.filtershow.provider.SharedImageProvider" android:grantUriPermissions="true" android:readPermission="com.android.gallery3d.filtershow.permission.READ" android:writePermission="com.android.gallery3d.filtershow.permission.WRITE" />

如果我們只需要開放部份的URI給其他的應用訪問呢?可以參考Provider的URI許可權設定,只允許訪問部份URI,可以參考原生ContactsProvider2的相關程式碼(注意path-permission這個選項):

        <provider android:name="ContactsProvider2"
            android:authorities="contacts;com.android.contacts"
            android:label="@string/provider_label"
            android:multiprocess="false"
            android:exported="true"
            android:grantUriPermissions="true"
            android:readPermission="android.permission.READ_CONTACTS"
            android:writePermission="android.permission.WRITE_CONTACTS">
            <path-permission
                    android:pathPrefix="/search_suggest_query"
                    android:readPermission="android.permission.GLOBAL_SEARCH" />
            <path-permission
                    android:pathPrefix="/search_suggest_shortcut"
                    android:readPermission="android.permission.GLOBAL_SEARCH" />
            <path-permission
                    android:pathPattern="/contacts/.*/photo"
                    android:readPermission="android.permission.GLOBAL_SEARCH" />
            <grant-uri-permission android:pathPattern=".*" />
        </provider>

ContentProvider介面方法執行在哪個執行緒中呢?

ContentProvider可以在AndroidManifest.xml中配置一個叫做android:multiprocess的屬性,預設值是false,表示ContentProvider是單例的,無論哪個客戶端應用的訪問都將是同一個ContentProvider物件,如果設為true,系統會為每一個訪問該ContentProvider的程序建立一個例項。

這點還是比較好理解的,那如果我要問每個ContentProvider的操作是在哪個執行緒中執行的呢(其實我們關心的是UI執行緒和工作執行緒)?比如我們在UI執行緒呼叫getContentResolver().query查詢資料,而當資料量很大時(或者需要進行較長時間的計算)會不會阻塞UI執行緒呢?

要分兩種情況回答這個問題:

  1. ContentProvider和呼叫者在同一個程序,ContentProvider的方法(query/insert/update/delete等)和呼叫者在同一執行緒中;
  1. ContentProvider和呼叫者在不同的程序,ContentProvider的方法會執行在它自身所在程序的一個Binder執行緒中。

但是,注意這兩種方式在ContentProvider的方法沒有執行完成前都會blocked呼叫者。所以你應該知道這個上面這個問題的答案了吧。

也可以看看CursorLoader這個類的原始碼,看Google自己是怎麼使用getContentResolver().query的。

ContentProvider是如何在不同應用程式之間傳輸資料的?

這個問題點有些深入,大家要對Binder程序間通訊機制比較瞭解。因為之前我們有提到過一個應用程序有16個Binder執行緒去和遠端服務進行互動,而每個執行緒可佔用的快取空間是128KB這樣,超過會報異常。ContentResolver雖然是通過Binder程序間通訊機制打通了應用程式之間共享資料的通道,但Content Provider元件在不同應用程式之間傳輸資料是基於匿名共享記憶體機制來實現的。有興趣的可以檢視一下老羅的文章Android系統匿名共享記憶體Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃

相關推薦

Android四大元件整理相關知識點

面試題:有使用過ContentProvider碼?能說說Android為什麼要設計ContentProvider這個元件嗎?ContentProvider應用程式間非常通用的共享資料的一種方式,也是Android官方推薦的方式。Android中許多系統應用都使用該方式實現資料共享,比如通訊錄、簡訊等。但我遇到

android四大元件3(BroadcastReceiver)

一、aandroid的四大元件BroadcastReceiver廣播接收器(用於接收程式所發出的Broadcast Intent),其本生就是一個全域性的監聽器,用於監聽系統全域性的廣播訊息。由於BroadcastReceiver是全域性的監聽器,所以它可以非常方便地實現系統中不同元件之間地通訊。

android四大元件組成是什麼,功能分別是

Android有四大元件:Activity、Service、Broadcast Receiver、Content Provider1、activity(1)一個Activity通常就是一個單獨的螢幕(視窗)。(2)Activity之間通過Intent進行通訊。(3)andro

android四大元件android應用程式的組成是什麼,功能分別是?

四大元件分別為activity、service、content provider、broadcast receiver。一、android四大元件詳解1、activity(1)一個Activity通常就是一個單獨的螢幕(視窗)。(2)Activity之間通過Intent進行通

一步一步學android控制元件之十四 —— NumberPicker

NumberPicker 是用於選擇一組預定義好數字的控制元件。比如時間hour的選擇只有0—23有效,則可以通過setMinValue和setMaxValue設定。 使用該控制元件時需注意他的兩個listener和一個formatter:一個listener用於監聽當前v

android-基礎知識整理--四大元件未完

四大元件: activity : 什麼是activity? Android程式與使用者互動的視窗 - 使用方式 生命週期 onCreat() onStart() on setContentView() ,//

Android--四大元件之BroadCastReceiver生命週期、實現原理及使用等

####1. BroadCastReceiver是什麼? ####2. 廣播型別 ######1). 有序廣播 ######2). 無序廣播 ####3. 生命週期 ####4. 實現原理 ####5. 使用方法 ####6. 許可權問題(安全性) ####7. LocalBroad

Android--四大元件之Activity

####1. Activity是什麼? ####2. 生命週期 ######1). Activity跳轉 ######2). 從後臺啟動 ######3). 橫豎屏切換 ####3. 啟動模式 ######1). 任務棧 ######2). laucherMode ######3).

Android四大元件2Service)

一、Service是android的四大元件,於activity最相似,於activity的區別在於,service一直執行在後臺,它沒有介面,所以絕不可能跑到前臺,一旦service被啟動起來,它就有它自己的額生命週期。service是四大元件,也是需要到androidManifest.xml檔案

Android四大元件之ContentProvider

上節提到的四大元件之ContentProvider的簡單使用,在這篇文章中詳細的介紹其中的一些方法。 1.String getType(Uri uri)方法 首先看看官方對它的解釋: /** * Implement this to handle requests

Android四大元件之ContentProvider

1.什麼是ContentProvider? 內容提供程式管理對資料結構化資料集的訪問。它們封裝資料,並提供用於定義資料安全性的機制。內容提供者是連線一個程序中的資料與另一個程序中執行的程式碼的標準介面。 是不同應用程式之間進行資料交換的標準API,以某種Uri的形式對外提供資料,

Android 四大元件 ————ContenProvider內容提供者

1,介紹:     內容提供者(Content Provider) 主要用於在不同的應用程式之間實現資料共享的功能,它提供了一套完整的機制,允許一個程式訪問另一個程式的資料,同時還能保證被訪資料的安全性。 2,簡單原理圖 3,程序間訪問對方資料庫: 【1

Android四大元件之Service全面解析

 在小杰的上一篇博文中給大家講了一下Android四大元件之一的Activity,也是最重要的,這一篇文章,給大家講一下Service。 什麼是Service  Service是Android的四大元件之一應用廣泛,它是一個能在後臺進行一個長時間的操作並且不提供使用者介面

Android四大元件之一 廣播接受者入門附程式碼詳解

BroadCastReceiver 廣播機制 BroadcastRecevier是Android的四大元件之一。一、廣播的分類: 1.普通廣播        當手機應用程式中一旦觸發了某件事情,那麼就會發送一段廣播,這段廣播時非同步的,能夠被所有的廣播監聽者接收,進行處理。

Android:四大元件之-----廣播Broadcast

相信很多讀者都與筆者一樣,在剛學安卓的時候就接觸到廣播。但是並不知道廣播其實也分好幾種,我們剛學習使用的只是廣播的其中一種:普通廣播 android的廣播分為: 普通廣播, 有序廣播, 本地廣播, sticky廣播, 下面就為大家介紹一下這四種廣播的區別與用法。 一.普通

Android四大元件之BroadcastReceiver

(一)概述 上節我們對BroadcastReceiver已經有了一個初步的瞭解了,知道兩種廣播型別:標準與有序, 動態或靜態註冊廣播接收者,監聽系統廣播,自己傳送廣播!已經滿足我們的基本需求了~ 但是前面寫的廣播都是全域性廣播!這同樣意味著我們APP發出的廣播

Android四大元件之廣播接收者BroadcastReceiver

廣播接收者簡介: 為了監聽來自系統或應用程式的廣播事件,Android系統提供了BroadcastReceiver(廣播接收者)元件。 廣播接收者建立: 右擊—-包名—-new—-Other—-Broadcast Receiver—-名字自取、其他預設

Android深入四大元件應用程式啟動過程

前言 在此前的文章中,我講過了Android系統啟動流程和Android應用程序啟動過程,這一篇順理成章來學習Android 7.0的應用程式的啟動過程。分析應用程式的啟動過程其實就是分析根Activity的啟動過程。 1.Launcher請求A

Android 四大元件 —— 活動活動的隱式跳轉

      上一篇我們討論了活動的顯示跳轉,現在來學習活動的隱式跳轉       相比於顯式Intent,隱式Intent 則含蓄了許多,它並不明確指出我們想要啟動哪一個活動,而是指定了一系列更為抽象的action 和category 等資訊,然後交由系統去分析這個Inte

Android四大元件之ContentProvider內容提供者

ContentProvider是什麼 ContentProvider是Android中的四大元件之一,主要用於不用應用之間共享資料,通過ContentProvider把應用中的資料共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中