Android 面試題總結之Android 基礎(二)

來源:互聯網
上載者:User

標籤:

Android 面試題總結之Android 基礎ContentProvider(二)

在上一章節Android 面試題總結之Android 基礎Activity(一) 我們講的Activity基礎知識。有許多朋友反映看著比較亂,我又回去看了看 ,確實很亂,不夠細心。然後我又重新整理了一遍。讓大家閱讀體驗更好!

在閱讀過程中有任何問題,請及時聯絡。
本章系《Android 之美 從0到1 – 高手之路》Android基礎ContentProvider 總結了Android 開發人員面試比較常見的ContentProvider和Intent相關面試問題。希望對廣大Android 開發人員,有所協助。

  • Android 面試題總結之Android 基礎ContentProvider二
    • ContentProvider 常見知識點

ContentProvider 常見知識點
  1. ContentProvider 是如何?資料共用的

    在 Android 中如果想將自己應用的資料(一般多為資料庫中的資料)提供 給第三發應用,那麼我們只能通過 ContentProvider 來實現了。
    ContentProvider 是應用程式之間共用資料的介面。使用的時候首先自訂 一個類繼承 ContentProvider,然後覆寫 query、insert、update、delete 等 方法。因為其是四大組件之一因此必須在 AndroidManifest 檔案中進行註冊。
    把自己的資料通過 uri 的形式共用出去
    android 系統下 不同程式 資料預設是不能共用訪問 需要去實現一個類去繼承 ContentProvider

    public class PersonContentProvider extends ContentProvider{    public boolean onCreate(){} query(Uri, String[], String, String[], String)insert(Uri, ContentValues)update(Uri, ContentValues, String, String[]) delete(Uri, String,  String[])}    

    “`

  第三方可以通過 ContentResolver 來訪問該 Provider。2. **Android 的資料存放區方式**  a. File 儲存  b. SharedPreference 儲存  c. ContentProvider 儲存  d. SQLiteDataBase 儲存  e. 網路儲存關於ContentProvider相關基礎知識點,本章節就先總結到這來。希望對大家有所協助。3. **為什麼要用 ContentProvider?它和 sql 的實現上有什麼差別?**  ContentProvider 屏蔽了資料存放區的細節,內部實現對使用者完全透明,使用者只 需要關心操作資料的 uri 就可以了,ContentProvider 可以實現不同 app 之間 共用。Sql 也有增刪改查的方法,但是 sql 只能查詢本應用下的資料庫。而 ContentProvider 還可以去增刪改查本地檔案. xml 檔案的讀取等。4. **說說ContentProvider 、 ContentResolver 、 ContentObserver 之間的關係**   a. ContentProvider 內容提供者,用於對外提供資料   b. ContentResolver.notifyChange(uri)發出訊息   c. ContentResolver 內容解析者,用於擷取內容提供者提供的資料    d. ContentObserver 內容監聽器,可以監聽資料的改變狀態   e. ContentResolver.registerContentObserver()監聽訊息。5. **Uri介紹**  為系統的每一個資源給其一個名字,比方說通話記錄。1)、每一個ContentProvider都擁有一個公用的URI,這個URI用於表示這個ContentProvider所提供的資料。 2)、Android所提供的ContentProvider都存放在android.provider包中。 將其分為A,B,C,D 4個部分:A:標準首碼,用來說明一個Content Provider控制這些資料,無法改變的;"content://" B:URI 的標識,用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。它定義了是哪個Content Provider提供這些資料。對於第三方應用程式,為了保證URI標識的唯一性,它必須是一個完整的、小寫類名。這個標識在 元素的 authorities屬性中說明:一般是定義該ContentProvider的包.類的名稱 C:路徑(path),通俗的講就是你要操作的資料庫中表的名字,或者你也可以自己定義,記得在使用的時候保持一致就可以了;"content://com.bing.provider.myprovider/tablename" D:如果URI中包含表示需要擷取的記錄的ID;則就返回該id對應的資料,如果沒有ID,就表示返回全部; "content://com.bing.provider.myprovider/tablename/#" #表示資料id。6. **如何訪問 asserts 資來源目錄下的資料庫?**    把資料庫db複製到 /data/data/packagename/databases/目錄下    然後直接就能訪問了。## Intent 詳解1. **Android Intent的使用**    三大組件——Activity、Service和Broadcast Receiver都是被什麼啟用的?答案:Intent是一種運行時綁定的訊息機制,而三大組件——Activity、Service和Broadcast Receiver都是被訊息啟用的,這種訊息就是Intent。    一個Intent對象包括六個屬性,請一一列舉這六個屬性。答案:組件名(Component Name)、動作(Action)、資料(Data)、分類(Category)、額外資訊(Extra)和標誌(Flags)。  答案:在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協助完成。正如網上一些人解析所說,Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent在這裡起著實現調用者與被調用者之間的解耦作用。Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:  1、顯: 虛擬碼    ```public TestB extents Activity  {   .........  };   public class Test extends Activity  {       ......       public void switchActivity()       {              Intent i = new Intent(Test.this, TestB.class);              this.startActivity(i);       }  } 

代碼簡潔明了,執行了switchActivity()函數,就會馬上跳轉到名為TestB的Activity中。

2、隱式意圖:

隱式匹配,首先要匹配Intent的幾項值:Action, Category, Data/Type,Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配。所以此部分只講前幾種匹配。匹配規則為最大匹配規則,

1、如果你填寫了Action,如果有一個程式的Manifest.xml中的某一個Activity的IntentFilter段中定義了包含了相同的Action那麼這個Intent就與這個目標Action匹配,如果這個Filter段中沒有定義Type,Category,那麼這個Activity就匹配了。但是如果手機中有兩個以上的程式匹配,那麼就會彈出一個對話可框來提示說明。
Action的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter中加入一個自訂的Action值(同時要設定Category值為”android.intent.category.DEFAULT”),在你的Intent中設定該值為Intent的Action,就直接能跳轉到你自己的Intent接收者中。因為這個Action在系統中是唯一的。
2、data/type,你可以用Uri來做為data,比如Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com 的scheme判斷出資料類型type
手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能處理http:的type,

3、至於分類Category,一般不要去在Intent中設定它,如果你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣所有不設定Category(Intent.addCategory(String c);)的Intent都會與這個Category匹配。

4、extras(附加資訊),是其它所有附加資訊的集合。使用extras可以為組件提供擴充資訊,比如,如果要執行“寄送電子郵件”這個動作,可以將電子郵件的標題、本文等儲存在extras裡,傳給電子郵件發送組件。

  1. IntentFilter(Intent過濾器)
    為什麼要引入IntentFilter?
    答案:對於顯式Intent,它的接受者已被指定,所以系統會自動把這個Intent發給指定的組件。但是對於隱式Intent,由於並沒有指定其組件名屬性,所以系統不知道該把它發給哪個組件名,於是系統就直接將其發出去,算是所有的組件都有權接收,這就需要定義一個組件可以接收到哪些Intent,所以就引入了IntentFilter(Intent過濾器)。

  2. Intent 傳遞資料時,可以傳遞哪些類型資料?
    Intent 可以傳遞的資料類型非常的豐富,java 的基礎資料型別 (Elementary Data Type)和 String 以及他們的數組形式都可以,除此之 外還可以傳遞實現了 Serializable 和 Parcelable 介面的對象。

  3. Serializable 和 Parcelable 的區別?
    1.在使用記憶體的時候,Parcelable 類比 Serializable 效能高,所以推薦使用 Parcelable 類。
    2.Serializable 在序列化的時候會產生大量的臨時變數,從而引起頻繁的 GC。
    3.Parcelable 不能使用在要將資料存放區在磁碟上的情況。儘管 Serializable 效率低點,但在這種情況下,還是建
    議你用 Serializable 。 實現:
    1 Serializable 的實現,只需要繼承 Serializable 即可。這隻是給對象打了一個標記,系統會自動將其序列化。
    2 Parcelabel 的實現,需要在類中添加一個靜態成員變數 CREATOR,這個變數需要繼承 Parcelable.Creator 接 口。

關於ContentProvider和Intent相關面試問題,本章節就先總結到這來。希望對大家有所協助。

水平有限,若有錯漏,歡迎指正,批評,如需轉載,請註明出處–http://blog.csdn.net/vfush,謝謝!

Android 面試題總結之Android 基礎(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.