Android開發Intent應用概述

來源:互聯網
上載者:User

今天,我們來研究一下Intent,沒錯,就是前面說過的比較難理解的那個東西,希望通過這篇文章之後,你發現前面那句話其實是不對的。
前文中說過,Intent就像Activity之間的雙面膠,就字面意思而言:“意圖, 意向, 目的”, 基本上可以詮釋這個對象的作用。它裡麵包含的就是一些資訊,這些資訊能夠告訴我們當前發生了什麼,以及想要幹什麼。我覺得和前面的事件驅動中的事件非常 像,不同的是,它不僅僅包含事件,還包含一些資料資訊。Intent或者也可以說像一個需求說明一樣,說明了當前的事件以及一些資料,接下 來,Android會依據這個Intent的說明,為其找到一個Activity,並把這個Intent交給這個Activity。看起來Intent好
像是徵婚廣告一樣哦,Intent提出自己的一些描述(不同的是,他描述的是自己,而不是描述的別人),然後Android根據這些描述找到何時的 Activity。
Intent有兩種,一種是顯式Intent,另一種是隱式Intent。顯式Intent會在自己的說明中直接聲明由誰(哪個Activity)來接收 處理這個Intent。顯式的Intent是說,我已經有了意中人了,告訴Android不用費勁找了,可以直接定位到意中人,例如前文中的這個例子:

Intent intent = new Intent();
intent.putExtra("name", editText.getText().toString());
intent.setClass(ActivityLifecycle.this, AlertDialog.class);

通過setClass方法,直接告訴Android,此Intent交由AlertDialog處理。也可以通過setComponent()、setClassName()等方法來做同樣的事情。
在一般的程式中, 我覺得使用顯式Intent已經足夠了。這樣程式看起來簡單易懂,畢竟大多數的Android程式都不會有太複雜的Activity之間的關係。
在前文中的另外一個方法中,使用的就是隱式的Intent。隱式Intent呢,比較含蓄,比較糊塗,比較模糊,還沒有明確的目標,並且比較悲觀,不會對對方提一些要求,只是描述了一下自己的情況,意思就是說,我就是我所描述的這樣的一個人,誰能接受, 誰就可以應徵。:)

Intent intent = new Intent();
intent.putExtra("name", editText.getText().toString());
intent.setAction("com.roiding.sample.action.MAIN");

Intent說明自己的方式有:

action 用來指明執行的動作,比如說ACTION_VIEW, ACTION_EDIT, ACTION_MAIN,這都是在Android中定義的標準action,開發人員可以自己定義自己需要的action,用字串來表示。更多標準 action參看這裡。
category 描述action的附加資訊,這個屬性我一直不太明白,它被設計出來的用意到底是為什麼,到目前為止,我對他的理解是:它就像一個action類別,例 如:CATEGORY_LAUNCHER、CATEGORY_ALTERNATIVE。屬於CATEGORY_LAUNCHER這個類別的,可以被 Android放到頂級列表(類似於九宮格的那個介面)中被執行,屬於CATEGORY_DEFAULT這個類別的,可以用 startActivity(intent)來啟動Activity,等等。而這些行為都是Android內定的,所以自訂category不知道會有
什麼意義,更多標準category參看這裡。
data 動作操作的資料,這部分資料會像嫁妝一樣,攜帶給接收它的Activity,Uri格式。Uri的概念和傳統的URI的概念是一致的,遵循RFC 2396。 而Uri最終是由ContentProvider提供的,所以會涉及到ContentProvider的概念,這裡也暫時不去解釋了,只需要知道這個 data所聲明的資料,就像一個url一樣,通過這個url,可以找到提供這個url的ContentProvider提供的資料,然後就可以操作這些資料了。這裡面的data似乎和前面的extras功能有重疊?按照我的理解,data確實可以放到extras中傳遞,但是單獨把它提出來確有它的用意。在後面的IntentFilter中會有交代。

既然已經比喻為徵婚廣告了,把Intent比喻為徵婚的需求,那麼由Android系統根據什麼挑選的候選人呢?
前面中說過這個檔案:AndroidManifest.xml,而且當時將其比喻為戶口簿,這下好了,所有的適齡青年(Activity)都在這個大的戶口簿上了,按照Intent的需求直接在戶口簿中尋找就可以了。那又是如何知道哪個適齡青年是否符合要求呢?
在AndroidManifest檔案中,對每個適齡青年(Activity)都做了說明,就是intent-filter,它說明了當前這個適齡青年願意接收什麼樣的需求,這樣當Intent與這個Intent-filter中的說明一致時,Intent就找到了Activity。
這樣,當一個Intent的所有說明,都被Activity的intent-filter接受時,這個Activity就是候選人之一。如果有多個 Activity成為候選人,那麼在程式啟動並執行時候Android提示你從多個Activity中手動選擇一個來作為最終的intent接收執行者。
對於Activity來說,在它的intent-filter中,可以有多個action,多個category,多個data,這樣可以有多個Intent可以與之匹配。
說到這裡,前面的那個關於data和extras功能重疊的問題似乎還沒有解決,所以這個data的重要的作用就是,它提供了一種反向挑選的機制,使 Activity對Intent也可以提出要求,要求Intent的data必須是intent-filter中聲明的data中之一(因為可以有多個 data)。這點是非常重要的,不然又會出現ActivityNotFoundException之類的錯誤了。
到此篇文章為止,一般的Android介面編程應該已經夠用了,而對於ContentProvider、Adapter、Services等,在一般的應用中,可以完全不用考慮。等到必須要使用的時候再說吧。

相關文章

聯繫我們

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