Android中的Intent詳解,AndroidIntent詳解

來源:互聯網
上載者:User

Android中的Intent詳解,AndroidIntent詳解
前言:

每個應用程式都有若干個Activity組成,每一個Activity都是一個應用程式與使用者進行互動的視窗,呈現不同的互動介面。因為每一個Acticity的任務不一樣,所以經常互在各個Activity之間進行跳轉,在Android中這個動作是靠Intent來完成的。你通過startActivity()方法發送一個Intent給系統,系統會根據這個Intent協助你找到對應的Activity,即使這個Activity在其他的應用中,也可以用這種方法啟動它。

Intent的定義:

Intent是Android系統用來抽象描述要執行的一個操作,也可以在不同組件之間進行溝通和訊息傳遞。

Intent意圖可以是明確的指定組件的名稱,這樣你可以精確的啟動某個系統組件,比如啟動一個Activity。它也可以是模糊的,沒有指定組件名稱,只要是能夠匹配到這個Intent的應用都可以接收到,比如發送一個拍照Intent,所有的拍照應用都會響應。

顯式Intent和隱式Intent:

顯式的Intent就是你已經知道要啟動的組件名稱,比如某個Activity的包名和類名,在Intent中明確的指定了這個組件(Activity),一般來說這種Intent經常用在一個應用中,因為你已經明確的知道要啟動的組件名稱。

隱式的Intent就是你不知道要啟動的組件名稱,只知道一個Intent動作要執行,比如:拍照,錄影,查看地圖。一般來說這種Intent用在不同的應用之間傳遞資訊。

當你建立一個顯式Intent來啟動一個Activity或者Service時,系統會立刻啟動那個組件通過你的Intent對象。

當你建立一個隱式Intent,系統會根據manifest file中的intent filter找匹配的組件,如果你發送的Intent匹配到一個intent filter,系統會把你的Intent傳遞給該filter對應的組件(Activity、Service等),並且啟動它。如果找到多個匹配的intent filter對應的應用程式,則會彈出一個對話方塊讓你選擇哪個應用程式接受你的Intent。

 
註:1、intent filter是一種應用程式manifest檔案中的文法表達,就像是html的標籤,它是一個系統組件標籤(比如:Activity)的組成部分,可以說是子標籤吧,這個系統組件接受什麼樣的intent就是用它來指定的,如果一個系統組件不寫intent filter,那麼它只能通過顯式的intent來啟動。2、出於安全的角度,你的Service組件務必不要用隱式的intent filter來進行說明,因為用隱式的intent啟動一個Service往往不能保證Service會被啟動,並且使用者也不知道哪個Service會響應你的Intent。從Android5.0(API 21),系統會拋出異常當你用隱式的Intent去調用bindService()方法。
建立一個Intent:

Android系統通過Intent對象攜帶的資訊來確定啟動哪個系統組件,比如:準確的組件名稱,哪一個類別的組件會接收到這個intent,Intent還會攜帶其他的資訊以便於組件正確的執行action。一個Intent主要包含以下資訊:

Component name:

要啟動的組件名稱,在建立Intent的時候是可選的,但是它是顯式Intent的重要標誌,有它就意味著只有Component name匹配上的那個組件才能接收你發送出來的顯示intent。如果不寫那麼你建立的Intent就是隱式的,系統會根據這個intent的其他資訊(比如:action、data、category)來確定哪些組件來接收這個intent,所以如果你想明確的啟動哪個組件,就通過component name來指定。

Intent的ComponentName屬性是一個類的全稱,包括包名,比如:com.example.ExampleActivity,你可以通過Intent的setComponent(),setClass(),setClassName()方法來設定,也可以通過Intent的構造方法來設定。

Action:

意圖,一個字串變數,用來指定Intent要執行的動作類別(比如:view or pick)。你可以在你的應用程式中自訂action,但是大部分的時候你只使用在Intent中定義的action。下面是啟動Activity經常用的action:

  • ACTION_VIEW:

在調用startActivity()方法啟動Activity時,用此action來呈現一些資訊給使用者,比如在相簿中查看一張照片,顯示一個地理位置在地圖中。

  • ACTION_SEND:

也被稱為"share"(共用)意圖,在調用startActivity()方法啟動Activity時,用此action來分享一些使用者想要分享的資料給其他應用程式,比如郵件app或者社交app。

想要瞭解更多的action可以查看Intent源碼或者api,在Intent中定義了很多action,除了在Android framework中,在別處也定義了很多action,比如在Settings應用中。

你可以通過Intent的setAction()方法或者Intent的構造方法來指定action。如果你要自訂action,最好是用你的包名做首碼,比如:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Data:

一個Uri對象,對應著一個資料,這個資料可能是MIME類型的。當建立一個intent時,除了要指定資料的URI之外,指定資料的類型(MIME type)也很重要,比如,一個activity能夠顯示照片但是無法播放視頻,雖然啟動Activity時URI格式很相似。指定MIME type是很重要的,它能夠協助系統找到最合適的那個系統組件來處理你的intent請求。然而,MIME type有時能夠通過URI來推測出來,特別是當data是content:的URI,這樣的data表明在裝置中由ContentProvider提供。

只設定資料的URI可以調用setData()方法,只設定MIME類型可以調用setType()方法,如果要同時設定這兩個可以調用setDataAndType()。

注意:如果要設定URI和MIME,不要調用setData()和setType(),因為會相互清除設定的參數資料,而是直接調用setDataAndType()。

Category:

一個包含Intent額外資訊的字串,表示哪種類型的組件來處理這個Intent。任何數量的Category 描述都可以添加到Intent中,但是很多intent不需要category,下面列舉一些常用的category:

  • CATEGORY_BROWSABLE:

目標Activity允許從web頁面上的連結(比片連結)啟動來顯示資料。

  • CATEGORY_LAUNCHER:

表示這個Activity是Activity棧最初的Activity,應用程式的主Activity,可以在傳統型應用程式列表找到並啟動它。

你可以通過調用addCagegory()方法來設定category。

以上Intent的屬性(component name、action、data and category)都是Intent的特徵屬性,通過這些屬性Android系統可以找到哪個應用組件將會被啟動。

 

以下的屬性是Intent的額外屬性,這些屬性不會影響到intent的處理和啟動系統組件。

Extras:

Intent可以攜帶的額外key-value資料,你可以通過調用putExtra()方法設定資料,每一個key對應一個value資料。你也可以通過建立Bundle對象來儲存所有資料,然後通過調用putExtras()方法來設定資料。對於資料key的名字要盡量用包名做首碼,然後再加上其他,這樣來保證key的唯一性。

Flags:

用來指示系統如何啟動一個Activity(比如:這個Activity屬於哪個Activity棧)和Activity啟動後如何處理它(比如:是否把這個Activity歸為最近的活動列表中)。

建立顯式Intent:

一個顯式Intent明確的指定了要啟動的組件名稱,比如Activity名稱或者Service的名稱。建立一個顯式的Intent必須定義Component屬性,其他的屬性可選。下面的例子是建立一個Service在app中,名字叫DownloadService,功能是從網路上下載檔案,你可以通過下面的代碼來啟動它:

// Executed in an Activity, so 'this' is the Context// The fileUrl is a string URL, such as "http://www.example.com/image.png"Intent downloadIntent = new Intent(this, DownloadService.class);downloadIntent.setData(Uri.parse(fileUrl));startService(downloadIntent);
建立隱式Intent:

一個隱式的Intent定義了將要執行的動作,任何在裝置上的app都可以響應這個動作。用隱式Intent的非常的有用,當你的app不能處理某些請求動作時,但是系統中的其他應用有這個處理的能力,使用者就能方便的利用其他應用完成這個操作。比如你用百度雲端硬碟下載了一個pdf文檔,你在點擊開啟這個文檔的時候百度雲端硬碟是無法開啟的,但是也許你系統上安裝有其他的能開啟pdf文檔的閱讀器,這個時候就會彈出一個對話方塊,列舉了可以開啟pdf文檔的應用程式,你可以自由選擇一個應用程式開啟你下載的文檔。例如下面查看文檔的例子:

// Create the text message with a stringIntent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); // "text/plain" MIME type// Verify that the intent will resolve to an activityif (sendIntent.resolveActivity(getPackageManager()) != null) {    startActivity(sendIntent);}
注意:也許你的裝置中沒有能夠執行你的隱式Intent的應用,這個時候startActivity將會失敗並且你的app會出現crash,最好的辦法是在startActivity之前調用resolveActivity檢查一下是否有Activity可以響應。如果系統中有一個應用程式可以響應則會直接開啟那個應用程式,如果系統中有多個app可以處理這個action則會彈出對話方塊讓你選擇哪個應用程式來處理。
總結:

以上內容主要說了Intent的定義、分類和屬性解釋,這樣讓你對Intent有一個詳細的瞭解,為以後學習利用Intent在應用程式之間進行交流打下基礎。

本文屬原創,轉載請註明出處,違者必究

關注公眾平台:程式員互動聯盟(coder_online),你可以第一時間擷取原創技術文章,和(java/C/C++/Android/Windows/Linux)技術大牛做朋友,線上交流編程經驗,擷取編程基礎知識,解決編程問題。程式員互動聯盟,開發人員自己的家。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.