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了。