天天看點

Intent進階 和 Intent-filter 學習筆記1,Intent的基礎用法2,深入Intent的構造和Intent-filter的基礎入門

Intent是android中各activity之間通信的一個很重要的類,一般我們是這麼使用的

//建立一個intent   

Intent intent = new Intent();     

//壓值進intent中   

//intent是基于一種基于Map的資料結構   

//傳我們的基本資料類型的可以之間key,value方式傳值   

intent.putExtra("hello","Hello world");     

//但是,傳一個對象的時要注意,該對象要實作序列化視窗才可以傳值   

//putExtra(String name, Serializable value)   

Demo demo = new Demo();   

intent.putExtra("Demo",demo);     

//然後,我們把這個intent傳到另外一個activity   

intent.setClass(xxx.this,zzz.class);   

startActivity(intent);     

//-------   

//目标activity   

//擷取傳過來的intent Intent intent = getIntent();     

//從Intent中擷取值   

String hello = intent.getStringExtra("Demo");   

Demo demo = (Demo)intent.getSerializable("Demo");   

<code>以上代碼就是最基礎的Intent的用法</code>

首先我們看下Intent的構造方法

Intent()   

//Create an empty intent.       

Intent(Intent o)   

//Copy constructor.       

Intent(String action)   

//Create an intent with a given action.       

Intent(String action, Uri uri)   

//Create an intent with a given action and for a given data url.       

Intent(Context packageContext, Class&lt;?&gt; cls)   

//Create an intent for a specific component.       

Intent(String action, Uri uri, Context packageContext, Class&lt;?&gt; cls)   

//Create an intent for a specific component with a specified action and data. 

<code>出這些構造方法中我們,可以看出,建立一個Intent其實可以設定很多東西,這裡我說說componentName,action,category,data</code>

componentName 直譯的話就是元件的名字的意思,如果我們寫的一個類當作成一個元件,那麼這個componentName就是用來封裝我們寫的這些類的位置.

//建立一個component的對象   

ComponentName componentName = new ComponentName(Context.this, xxx.class);     

Intent intent  = new Intent();   

Intent.setComponent(componentName);     

//----------   

//在xxxactivity中   

ComponentName comp = getIntent().getComponent();     

String packageName = comp.getPackName();   

String className = comp.getClassName(); 

<code>其實細心的同學可以發現,其實跟setClass(),沒什麼差別嗎,而且,還比setClass()麻煩,其實,setClass()是封裝了這個功能而已,最實作還是要用到這個類.</code>

我感覺,學intent 和 intent-filter把action,category,data搞清楚才算真正的掌握了intent的用法.

如果學過Structs2的同學應該不會陌生,所謂的action就是發送一個特定的請求,然後,由一個符合這個請求的activity響應

官方文檔中是這麼說action的:

我簡要說下我了解的大義,有錯歡迎指出

action 在很大一部分程度上決定你的intent 是如何建構的,特别是還有data,和 額外的一些字段,還有更多的是如何決定方法名,設定數組和傳回的參數.由于這個原因,這是一個很好的方法去盡可能的具體的使用action,用action把這些字段緊密的聯系在一起.另外,靈活定義你的action,然後把它定義在一個文檔中為你的intent對象的組建能夠正常處理

渣翻譯…可能比谷歌翻譯還有爛…有錯歡迎指出!!!!!!!!!!!!!

要使一個action能夠正常運作,category是必不可少的,關于category詳細介紹請看開發者文檔中的intent and intent-filter

這裡說下注意的細節和使用.

首先,這句話是很重要的..取之于官方文檔

Therefore, activities that are willing to receive implicit intents must include "<code>android.intent.category.DEFAULT</code>" in their intent filters.

這句話,告訴我們在intent-filter(可以用xml建立也可以用代碼建立,這裡主要講xml的建立),必須添加一個<code>android.intent.category.DEFAULT</code>,至于,不添加會發生什麼事…我花了半個小時的排錯告訴我是無法運作的

//在我們要運作的activity中添加   

&lt;activity android:name=".SecondActivity" android:label="second"&gt;                           &lt;intent-filter &gt;                                 

&lt;action android:name="kg.tom.TEST"/&gt;                 

&lt;category android:name="   

android.intent.category.DEFAULT " /&gt;               

&lt;/intent-filter&gt;           

&lt;/activity&gt;   

//firstActivity   

//在建立好的一個監聽器裡面方法中寫上   

Intent intent = new Intent();   

intent.setAction("kg.tom.TEST");     

//利用action來運作相應的activity startActivity(intent);   

注意:每個intent隻能設定一個action,但是,可以設定多個category,這裡的組合問題,自己好好想想吧.

因為就是一些參數的介紹,看官方文檔就好了,我是這樣了解這個DATA,例如,我們一個Mp3播放器,當我們在任務管理器中點選一個MP3檔案,MP3這個檔案就是一個data,就會觸發我們,在intent-filter比對這個Mp3,&lt;data /&gt;的activity運作..

本文轉自 liam2199 部落格,原文連結:http://blog.51cto.com/youxilua/772705   如需轉載請自行聯系原作者

繼續閱讀