Android Intent詳解
一、什麼是Intent,有什麼作用?
Android的應用程式包括四大元件:Activity、contentProvider、Service、BroadcastReceiver,為了方便不同元件之間的交流通訊,應用程式就採用了一種統一的方式啟動元件及傳遞資料,即使用Intent。
Intent封裝了Android應用程式需要啟動某個元件的”意圖”,Intent類的物件是元件間的通訊載體,一個Intent物件就是一組資訊,其包含接收Intent元件所關心的資訊(如action 和 Data)和Android 系統關心的資訊(如Category等)。也就是說,傳送”意圖”的元件通過Intent物件所包含的內容,來啟動指定的(即Component屬性)或通過篩選(即Action&Category屬性)的某(些)元件,然後實施相應的動作(即Action屬性)並傳遞相應的資料(即Data屬性)以便完成相應的動作。
二、Intent是如何實現元件間相互呼叫?
首先,發出”意圖”的元件,通過呼叫Context.startActivity(intent)開始啟動元件:發出”意圖”的元件傳入已經構好的Intent物件(為一組資訊,它決定了是否能夠成功的啟動另一個元件);
然後,呼叫”動作”實際的執行著Instrumentation物件,它是整個應用啟用的Activity管理者,集中負責應用內所有Activity的執行。它有一個隱藏的方法execStartActivity方法,就是負責根據Intent啟動Activity。該方法去掉一些細節,它做得最重要的事情,就是將此呼叫,通過RPC的方式,傳遞到ActivityManagerService。
最後,ActivityManagerService會將這些關鍵資訊遞交給另一個服務PackageManagerService,此服務掌握整個軟體包及其各元件的資訊,它會將傳遞過來的Intent,與已知的所有Intent Filters進行匹配(如果帶有Component資訊,就不用比了)。如果找到了,就把相關Component的資訊通知回AcitivityManagerService,在這裡,會完成啟動Activity這個很多細節的事情。
三、屬性
1.Action屬性
Action屬性為一個普通的字串,它代表了該Intent物件要完成一個什麼樣的”動作”。當我們為Intent物件指明瞭一個action時,被啟動的元件就會依照這個動作的指示表現出相應的行為,比如檢視、撥打、編輯等,需要注意的是一個元件(如Activity)只能有一個action。我們可以方便自己的應用程式元件之間的通訊,自定義action的(字串)建立新的動作;也可以直接使用Intent類中的靜態成員變數,比如ACTION_VIEW,ACTION_PICK,它們是Android中為action屬性預定義的一批action變數。
2.Data屬性
Action屬性為Intent物件描述了一個”動作”,那麼Data屬性就為Intent物件的Action屬性提供了操作的資料。這裡需要注意的是,Data屬性只接受一個Uri物件,一個Uri物件通常通過如下形式的字串來表示:
Uri字串格式:scheme://host:port/path 舉例: content://com.android.contacts/contacts/1或tel://18819463209
其中包含:mimeType 型別 scheme 域名 host port path
3.Catagory屬性
通過Action,配合Data或Type屬性可以準確的表達出一個完整的意圖了。但為了使的”意圖”更加精確,我們也給意圖新增一些約束,這個約束由”意圖”的Catagory屬性實現。一個意圖只能指定一個action屬性,但是可以新增一個或多個Catagory屬性。Category屬性可以自定義字串實現,但為了方便不同應用之間的通訊還可以設定系統預定義的Category常量。呼叫方法addCategory 用來為Intent 新增一個Category,方法removeCategory 用來移除一個Category;getCategories方法返回已定義的Category。
4.Flags屬性
能識別,有輸入,整個Intent基本就完整了,但還有一些附件的指令,需要放在Flags中帶過去。顧名思義,Flags是一個整形數,有一些列的標誌 位構成,這些標誌,是用來指明執行模式的。比如,你期望這個意圖的執行者,和你執行在兩個完全不同的任務中(或說程序也無妨吧…),就需要設定FLAG_ACTIVITY_NEW_TASK 的標誌位。
四、URI(統一資源識別符號)
Uri字串格式:scheme://host:port/path
歡迎大家關注我左側的微信公眾號,致力於Android知識,技術,心得等的分享與交流。並提供Android學習的路線與思維導圖。