android拾遺——Android Intent詳解

1、 Intent 做用java

Intent 是一個將要執行的動做的抽象的描述,通常來講是做爲參數來使用,由Intent來協助完成android各個組件之間的通信。好比說調用startActivity()來啓動一個activity,或者由broadcaseIntent()來傳遞給全部感興趣的BroadcaseReceiver, 再或者由startService()/bindservice()來啓動一個後臺的service.因此能夠看出來,intent主要是用來啓動其餘的activity 或者service,因此能夠將intent理解成activity之間的粘合劑。android

2、 Intent的構成web

要在不一樣的activity之間傳遞數據,就要在intent中包含相應的東西,通常來講數據中最基本的應該包括:瀏覽器

          Action 用來指明要實施的動做是什麼,好比說ACTION_VIEW, ACTION_EDIT等。具體的能夠查閱android SDK-> reference中的Android.content.intent類,裏面的constants中定義了全部的action。服務器

         一些經常使用的Action:ide


ACTION_CALL activity 啓動一個電話.
函數

ACTION_EDIT activity 顯示用戶編輯的數據.
學習

ACTION_MAIN activity 做爲Task中第一個Activity啓動
ACTION_SYNC activity 同步手機與數據服務器上的數據.
測試

ACTION_BATTERY_LOW broadcast receiver 電池電量太低警告.
ui

ACTION_HEADSET_PLUG broadcast receiver 插拔耳機警告
ACTION_SCREEN_ON broadcast receiver 屏幕變亮警告.


ACTION_TIMEZONE_CHANGED broadcast receiver 改變時區警告.

 

          Data 要事實的具體的數據,通常由一個Uri變量來表示

 

          Category(類別): 這個選項指定了將要執行的這個action的其餘一些額外的信息,例如 LAUNCHER_CATEGORY 表示Intent 的接受者應該在Launcher中做爲頂級應用出現;而ALTERNATIVE_CATEGORY表示當前的Intent是一系列的可選動做中的一個,這些動做能夠在同一塊數據上執行。具體一樣能夠參考android SDK-> reference中的Android.content.intent類。之前我也寫過一篇於category有關的文章,點擊這裏能夠查看。

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

          component(組件): 指定Intent的的目標組件的 類名稱。一般 Android會根據Intent 中包含的其它屬性的信息,好比action、data/type、category進行查找,最終找到一個與之匹配的目標組件。可是,若是 component這個屬性有指定的話,將直接使用它指定的組件,而再也不執行上述查找過程。指定了這個屬性之後,Intent的其它全部屬性都是可選的。

          extras(附加信息),是其它全部附加信息的集合。使用extras能夠爲組件提供擴展信息,好比,若是要執行「發送電子郵件」這個動做,能夠將電子郵件的標題、正文等保存在extras裏,傳給電子郵件發送組件。

下面是這些額外屬性的幾個例子:

ACTION_MAIN with category CATEGORY_HOME //用來 Launch home screen. 之前我也寫過一篇於與之有關的文章, 點擊這裏能夠看到。

ACTION_GET_CONTENT with MIME type vnd.android.cursor.item/phone //用來列出列表中的全部人的電話號碼

綜上能夠看出,action、 data/type、category和extras 一塊兒造成了一種語言,這種語言能夠是android能夠表達出諸如「給張三打電話」之類的短語組合。

3、 intent的解析

應用程序的組件爲了告訴Android本身能響應、處理哪些隱式Intent請求,能夠聲明一個甚至多個Intent Filter。每一個Intent Filter描述該組件所能響應Intent請求的能力——組件但願接收什麼類型的請求行爲,什麼類型的請求數據。好比以前請求網頁瀏覽器這個例子中,網頁瀏覽器程序的Intent Filter就應該聲明它所但願接收的Intent Action是WEB_SEARCH_ACTION,以及與之相關的請求數據是網頁地址URI格式。如何爲組件聲明本身的Intent Filter? 常見的方法是在AndroidManifest.xml文件中用屬性< Intent-Filter>描述組件的Intent Filter。

  前面咱們提到,隱式Intent(Explicit Intents)和Intent Filter(Implicit Intents)進行比較時的三要素是Intent的動做、數據以及類別。實際上,一個隱式Intent請求要可以傳遞給目標組件,必要經過這三個方面的檢查。若是任何一方面不匹配,Android都不會將該隱式Intent傳遞給目標組件。接下來咱們講解這三方面檢查的具體規則。

  1.動做測試

  Java代碼

 < intent-filter>元素中能夠包括子元素< action>,好比: < intent-filter> < action android:name=」com.example.project.SHOW_CURRENT」 /> < action android:name=」com.example.project.SHOW_RECENT」 /> < action android:name=」com.example.project.SHOW_PENDING」 /> < /intent-filter> 

  一條< intent-filter>元素至少應該包含一個< action>,不然任何Intent請求都不能和該< intent-filter>匹配。若是Intent請求的Action和< intent-filter>中個某一條< action>匹配,那麼該Intent就經過了這條< intent-filter>的動做測試。若是Intent請求或< intent-filter>中沒有說明具體的Action類型,那麼會出現下面兩種狀況。 

(1) 若是< intent-filter>中沒有包含任何Action類型,那麼不管什麼Intent請求都沒法和這條< intent- filter>匹配;

(2) 反之,若是Intent請求中沒有設定Action類型,那麼只要< intent-filter>中包含有Action類型,這個 Intent請求就將順利地經過< intent-filter>的行爲測試。 

    2.類別測試

  Java代碼

 < intent-filter>元素能夠包含< category>子元素,好比: < intent-filter . . . > < category android:name=」android.Intent.Category.DEFAULT」 /> < category android:name=」android.Intent.Category.BROWSABLE」 /> < /intent-filter> 

  只有當Intent請求中全部的Category與組件中某一個IntentFilter的< category>徹底匹配時,纔會讓該 Intent請求經過測試,IntentFilter中多餘的< category>聲明並不會致使匹配失敗。一個沒有指定任何類別測試的 IntentFilter僅僅只會匹配沒有設置類別的Intent請求。 

    3.數據測試

  數據在< intent-filter>中的描述以下: Java代碼 

< intent-filter . . . > < data android:type=」video/mpeg」 android:scheme=」http」 . . . /> < data android:type=」audio/mpeg」 android:scheme=」http」 . . . /> < /intent-filter> 

   元素指定了但願接受的Intent請求的數據URI和數據類型,URI被分紅三部分來進行匹配:scheme、 authority和path。其中,用setData()設定的Inteat請求的URI數據類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也須要相匹配纔會經過測試。

 4.簡單例子說明

  講解完Intent基本概念以後,接下來咱們就使用Intent激活Android自帶的電話撥號程序,經過這個實例你會發現,使用Intent並不像其概念描述得那樣難。最終建立Intent的代碼以下所示。

  Intent i = new

Intent(Intent.ACTION_DIAL,Uri.parse(」tel://13800138000″));

  建立好Intent以後,你就能夠經過它告訴Android但願啓動新的Activity了。

  startActivity(i);

  Activity啓動後顯示界面以下:

 

 

4、Intent的構造函數

公共構造函數:

一、Intent() 空構造函數

二、Intent(Intent o) 拷貝構造函數

三、Intent(String action) 指定action類型的構造函數

四、Intent(String action, Uri uri) 指定Action類型和Uri的構造函數,URI主要是結合程序之間的數據共享ContentProvider

五、Intent(Context packageContext, Class<?> cls) 傳入組件的構造函數,也就是上文提到的

六、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前兩種結合體

Intent有六種構造函數,三、四、5是最經常使用的,並非其餘沒用!

Intent(String action, Uri uri)  的action就是對應在AndroidMainfest.xml中的action節點的name屬性值。在Intent類中定義了不少的Action和Category常量。

示例代碼二:

   1: Intent intent = new Intent(Intent.ACTION_EDIT, null);

   2: startActivity(intent);

示例代碼二是用了第四種構造函數,只是uri參數爲null。執行此代碼的時候,系統就會在程序主配置文件AndroidMainfest.xml中尋找

<action android:name="android.intent.action.EDIT" />對應的Activity,若是對應爲多個activity具備<action android:name="android.intent.action.EDIT" />此時就會彈出一個dailog選擇Activity。

 若是是用示例代碼一那種方式進行發送則不會有這種狀況。

利用Intent在Activity之間傳遞數據

在Main中執行以下代碼:

   1: Bundle bundle = new Bundle();

   2: bundle.putStringArray("NAMEARR", nameArr);

   3: Intent intent = new Intent(Main.this, CountList.class);

   4: intent.putExtras(bundle);

   5: startActivity(intent);

在CountList中,代碼以下:

   1: Bundle bundle = this.getIntent().getExtras();

   2: String[] arrName = bundle.getStringArray("NAMEARR");

以上代碼就實現了Activity之間的數據傳遞!

總結說明

  這篇文章是我剛開始學習Android時看到的,當時理解的不是很深刻,如今再回頭看這篇文章總結的很詳細,在這裏與你們分享。

  1,調用web瀏覽器

  Java代碼

  Uri myBlogUri = Uri.parse("http://kuikui.javaeye.com");

  returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri);

 

  2,地圖

  Java代碼

  Uri mapUri = Uri.parse("geo:38.899533,-77.036476");

  returnIt = new Intent(Intent.ACTION_VIEW, mapUri);

 

  3,調撥打電話界面

  Java代碼

  Uri telUri = Uri.parse("tel:100861");

  returnIt = new Intent(Intent.ACTION_DIAL, telUri);

 

  4,直接撥打電話

  Java代碼

  Uri callUri = Uri.parse("tel:100861");

  returnIt = new Intent(Intent.ACTION_CALL, callUri);

 

  5,卸載

  Java代碼

  Uri uninstallUri = Uri.fromParts("package", "xxx", null);

  returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

 

  6,安裝

  Java代碼

  Uri installUri = Uri.fromParts("package", "xxx", null);

  returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

 

  7,播放

  Java代碼

  Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");

  returnIt = new Intent(Intent.ACTION_VIEW, playUri);

 

  8,調用發郵件

  Java代碼

  Uri emailUri = Uri.parse("mailto:shenrenkui@gmail.com");

  returnIt = new Intent(Intent.ACTION_SENDTO, emailUri);

 

  9,發郵件

  Java代碼

  returnIt = new Intent(Intent.ACTION_SEND);

  String[] tos = { "shenrenkui@gmail.com" };

  String[] ccs = { "shenrenkui@gmail.com" };

  returnIt.putExtra(Intent.EXTRA_EMAIL, tos);

  returnIt.putExtra(Intent.EXTRA_CC, ccs);

  returnIt.putExtra(Intent.EXTRA_TEXT, "body");

  returnIt.putExtra(Intent.EXTRA_SUBJECT, "subject");

  returnIt.setType("message/rfc882");

  Intent.createChooser(returnIt, "Choose Email Client");

  

  10,發短信

 Java代碼

  Uri smsUri = Uri.parse("tel:100861");

  returnIt = new Intent(Intent.ACTION_VIEW, smsUri);

  returnIt.putExtra("sms_body", "shenrenkui");

  returnIt.setType("vnd.android-dir/mms-sms");

 

  11,直接發郵件

  Java代碼

  Uri smsToUri = Uri.parse("smsto://100861");

  returnIt = new Intent(Intent.ACTION_SENDTO, smsToUri);

  returnIt.putExtra("sms_body", "shenrenkui");

 

  12,發彩信

  Java代碼

  Uri mmsUri = Uri.parse("content://media/external/images/media/23");

  returnIt = new Intent(Intent.ACTION_SEND);

  returnIt.putExtra("sms_body", "shenrenkui");

  returnIt.putExtra(Intent.EXTRA_STREAM, mmsUri);

  returnIt.setType("image/png");

 

  用獲取到的Intent直接調用startActivity(returnIt)就ok了。

相關文章
相關標籤/搜索