android應用開發之intent的妙用一

相信做android應用開發的朋友對intent組件都已經是相當熟悉了,這裏鄙人總結一下intent的妙用,希望對大家有幫助。

intent妙用之編寫自己的android主界面

衆所周知,android的主界面名爲laucher2,功能強大,會在android啓動之後運行,也是所有其他應用程序的入口程序。那麼,如何讓自己的應用程序取代laucher2的位置,成爲android系統的主界面呢?其實說出來很簡單,接下來,我就來爲大家揭開這其中的神祕面紗。

首先,我們來看看一個普通的應用程序的intent聲明:


<intent-filter>  
             <action android:name="android.intent.action.MAIN" />  
             <category android:name="android.intent.category.LAUNCHER" />  
         </intent-filter>  
是不是看着很眼熟呢?沒錯了,這段代碼是在AndroidManifest.xml中相應activity的intent聲明,相信大家目前縮寫的應用程序的intent聲明無一例外都是這樣的吧。可能很多人都會對着兩行代碼有下面的理解:
第二行<action android:name="android.intent.action.MAIN" />表示這個activity是當前應用程序的主activity,而第二行表示當前activity在lancher中加載。

這麼理解的卻是沒錯,但事實上,有更加簡單的理解方式。這裏請容許我先賣個關子。我們繼續往下看。

既然是想讓我們自己的應用程序取代laucher的位置,那麼我們就來看一下lancher的intent聲明是怎麼樣的吧:


<intent-filter>  
        <action android:name="android.intent.action.MAIN" />  
        <category android:name="android.intent.category.HOME"/>  
        <category android:name="android.intent.category.DEFAULT" />  
        <category android:name="android.intent.category.MONKEY" />  
    </intent-filter> 
當然,想要看到這段代碼,你必須要有laucher的源代碼。(關於android源代碼的問題,前面的文章已經提到過很多次了,有源代碼真的是件很好的事情,不管是對應用程序開發者來說還是對底層開發者來說亦或是對android愛好者來說,都會受益匪淺的,所以這裏再次建議大家不要僅僅侷限於android sdk和avd的使用來進行應用程序的開發,不管你有沒有時間,下份源代碼總是沒有壞處的。)
大家看出這兩個intent聲明之間的差別了嗎?沒錯,當出現  <category android:name="android.intent.category.HOME"/>  的時候,我們的應用程序就會變成跟lancher具有相同功能的(當然,我指的僅僅是主界面,laucher的功能是在是太強大了),成爲android系統的主界面,並且,當我們按下Home鍵的時候,會出現一個選擇界面,是不是發現你的應用程序和laucher同時出現在了選擇框中呢?如果是,那麼恭喜你,從功能上來說,你已經實現了。如果沒有看到,請email我[email protected]

但是,所謂一山不容二虎,同時有兩個主界面存在當然不是我們想要的。

如果你有android源代碼的話,你甚至可以把laucher刪掉,直接將你自己的應用程序編譯到android系統中,這樣,系統啓動的時候就會直接運行你的應用程序,而你的應用程序就會堂而皇之地鳩佔鵲巢,順理成章的成爲系統的主界面,並且當你按下Home鍵的時候,就會跳到你的應用程序的主activity了!!

如果你只是一個功能上的追求者,那麼看到這裏你就可以關掉這個頁面去試試上面的功能了。

如果你是一個好奇心比較強的人,那麼請跟着我繼續往下看。

剛纔我說過,intent聲明的理解問題。事實上,你可以有更好的理解方式,當然,這要建立在你對android系統的啓動進程有一定的瞭解的基礎上。

簡單來說,intent其實就是一個條件過濾器,activity的intent聲明的每一條都可以作爲一個過濾條件,條目越多,過濾條件也就越強,定位起來也就越容易。相信這個原理學過數據庫的朋友理解起來更加容易。你可以將整個android系統中所有的activity都集中起來當成是一個數據庫,而intent本身就是一條select語句,其中每一項聲明都是一項過濾條件,而過濾之後剩下的,就是將要被調用的activity。當過濾條件足夠強大或者過濾條件比較特殊的時候,最後剩下的只有一個activity,那麼系統會毫不猶豫地啓動它;當過濾條件不足導致過濾之後還剩下比較多的activity的時候,系統會將滿足這些條件的所有的activity用一個listview列出來讓你選擇。

相信原理大家都已經很清楚了,那麼上面所述的這個功能就很好理解了。沒錯,android在啓動的時候會有一個PackageManager選擇系統中滿足過濾條件:


<action android:name="android.intent.action.MAIN" />  
        <category android:name="android.intent.category.HOME"/>  
        <category android:name="android.intent.category.DEFAULT" />  
        <category android:name="android.intent.category.MONKEY" />  
的activity作爲系統啓動的第一個activity,也就是主界面,任何一個滿足這個過濾條件的activity都將進入候選名單,如果候選名單中僅有一人,那麼很榮幸,不戰而勝,你就是系統的主界面了;如果候選名單中有多個人(比如剛纔說的有laucher和你自己的應用程序),那麼就進入殘酷的”民意選舉“,也就是用戶自己的選擇,你選誰系統就會啓動誰。但和民意選舉不同的是,選舉出來的結果通常會有一定的任期,而這個主界面的選舉任期非常的短,每當你按下一次Home鍵或者重啓一下系統,系統就會重新安排一次”民意選舉“。如果想要永遠的成爲主界面,那麼唯一的辦法就是--沒錯,雖然很殘酷,但不得不說--就是,幹掉它......或者和諧一點,你可以讓它活着,但是也必須將它貶爲庶民或者是將其發配邊疆,具體的實施手段就是--改掉它的intent聲明,使其不滿足主界面的這個過濾條件。
在整個intent妙用章節中,這一章算是比較特殊的,因爲雖然所有的章節運用的原理基本相通,也就是我上面說到的原理,但是後續章節的intent過濾條件都是可以由用戶自己定義、手動修改的,而唯獨只有這個是不能改的,你只能決定去適應或者不適應這個過濾條件,而不能去改變這個過濾條件,就像你只能去適應這個社會,卻很難改變它--或許不是不能,而是暫時還能找到途徑......

有時候真的,生活跟計算機,居然有如此之多的相似之處......
————————————————
版權聲明:本文爲CSDN博主「七夜_雪」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/louiswangbing/article/details/6607612

發佈了36 篇原創文章 · 獲贊 163 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章