Android基礎知識 — Intent的理解與使用

概述

在日常開發中常常用到Intent,例如在啓動Activity , 啓動service ,發送廣播時都須要指定一個Intent, Intent 是一個將要執行動做的抽象描述,一笑消息的傳遞對象,負責各個組件之間的通信android

主要用途

Intent 是一個消息傳遞對象,您能夠用來從其餘應用組件請求操做。儘管 Intent 能夠經過多種方式促進組件之間的通訊,但其基本用例主要包括如下三個bash

  • 啓動Activity

Activity表示一個應用頁面,經過Intent傳遞給StartActivity()來啓動新的頁面,Intent 用於描述要啓動的 Activity,並攜帶任何須要的數據 。 若是但願在Activity 完成後收到結果,請調用 startActivityForResult()。在 Activity 的 onActivityResult() 回調中,您的 Activity 將結果做爲單獨的 Intent 對象接收服務器

  • 啓動Service

Service 是一個不使用用戶界面而在後臺執行操做的組件,您可使用 Service 類的方法來啓動服務。經過將 Intent 傳遞給 startService(),您能夠啓動服務執行一次性操做(例如,下載文件)。Intent 用於描述要啓動的服務,並攜帶任何須要的數據。 若是服務旨在使用客戶端-服務器接口,則經過將 Intent 傳遞給 bindService(),您能夠從其餘組件綁定到此服務spa

  • 發送廣播

廣播是任何應用都可接收的消息,系統將針對系統事件(例如:系統啓動或設備開始充電時)傳遞各類廣播。經過將 Intent 傳遞給 sendBroadcast() 或 sendOrderedBroadcast(),您能夠將廣播傳遞給其餘應用code

Intent的結構

Intent 對象主要包含七大屬性,Action(動做)、Data(數據)、Category(類別)、Type(數據類型)、Component(組件)、Extra(擴展信息)、Flag(標誌位)。其中最經常使用的是Action和Data對象

  • Action

Action主要表示意圖的行爲,,指定該Intent要執行的動做類型 常見的action有: Activity Actions:接口

類型 做用
ACTION_MAIN 表示程序入口
ACTION_VIEW 自動以最合適的方式顯示Data
ACTION_CALL 撥打Data指向的號碼
ACTION_SEND 發送Data到指定的地方
ACTION_SEARCH 執行搜索

Broadcast Actions:進程

類型 做用
ACTION_TIME_TICK 當前時間改變,並即時發送時間,只能經過系統發送。調用格式"android.intent.action.TIME_TICK"
ACTION_TIME_CHENGED 設置時間。調用格式"android.intent.action.TIME_SET"
  • Data:各個組件之間要傳遞的數據

例如查看通信錄的我的信息就是以Uri的形式傳遞數據事件

  • Category:用來表現動做的類別

一個包含Intent額外信息的字符串,表示哪一種類型的組件來處理這個Intent內存

  • Type:指定數據類型

通常Intent的數據類型可以根據數據自己進行斷定,可是經過設置這個屬性,能夠強制採用顯式指定的類型而再也不進行推導

  • Component:目的組件

指定Intent的目標組件名稱,當指定了這個屬性後,系統將跳過匹配其餘屬性,而直接匹配這個屬性來啓動對應的組件

  • Extra:擴展信息

Intent能夠攜帶的額外 key-value 數據,你能夠經過調用putExtra()方法設置數據,每個 key對應一個 value數據。你也能夠經過建立 Bundle對象來存儲全部數據,而後經過調用putExtras()方法來設置數據

  • Flag: 指望這個意圖的運行模式

用來指示系統如何啓動一個Activity,能夠經過setFlags()或者addFlags()能夠把標籤flag用在Intent中

Intent的類型

  • 顯示Intent:指定具體的組件名稱,一般,您會在本身的應用中使用顯式 Intent 來啓動組件,這是由於您知道要啓動的 Activity 或服務的類名。例如,您可能會啓動您應用內的新 Activity 以響應用戶操做,或者啓動服務以在後臺下載文件
Intent intent = new Intent(getApplicationContext(), MvpActivity.class);
                startActivity(intent);
複製代碼
  • 隱式Intent: 不指定具體的組件名稱,而是聲明要執行的常規操做,從而容許其餘應用中的組件來處理
Uri uri = Uri.parse("https://www.baidu.com");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(uri);
        startActivity(intent);
複製代碼

使用隱式 Intent 時,Android 系統經過將 Intent 的內容與在設備上其餘應用的清單文件中聲明的 Intent 過濾器進行比較,從而找到要啓動的相應組件。若是 Intent 與 Intent 過濾器匹配,則系統將啓動該組件,並向其傳遞 Intent 對象。若是多個 Intent 過濾器兼容,則系統會顯示一個對話框,支持用戶選取要使用的應用。

Intent 過濾器是應用清單文件中的一個表達式,用於指定該組件要接收的 Intent 類型。例如,經過爲 Activity 聲明 Intent 過濾器,您可使其餘應用可以直接使用某一特定類型的 Intent 啓動 Activity。一樣,若是您沒有爲 Activity 聲明任何 Intent 過濾器,則 Activity 只能經過顯式 Intent 啓動

Intent數據傳遞大小的限制

StartActivity時候最終調用了ActivityManger.getService().startActivity的方法,並涉及到了進程間通信,️而所映射的Binder內存大小是不到1M的,準確說是 (1024*1024) - (4096 *2) :這個限制定義在,因此最大的傳輸數據是不超過1M的數據

相關文章
相關標籤/搜索