Android之Intent使用

來源:互聯網
上載者:User

Android之Intent使用

intent簡介 Intent對象的組成 顯式Intent與隱式Intent 顯式Intent 隱式Intent

intent簡介

intent用於組件之間的跳轉,它在程式運行時串連兩個組件;intent分為顯式intent和隱式intent,顯式intent常用在本應用之間組件的跳轉,隱式intent常用於在不同應用之間組件的跳轉。通過Intent,你可以向Android提交一個請求,Android會根據Intent的意願來選擇合適的組件來響應請求。這篇文章不會介紹不同應用通過intent之間資料的傳遞,介紹顯式Intent與隱式Intent

Intent對象的組成

Intent對象

目標組件Components 動作(Action) 類別(category) 資料(data) 附加資料(extras) 標誌(Flags)

這裡介紹顯式Intent和隱式Intent

顯式Intent與隱式Intent1.顯式Intent

指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應用啟動對應的組件。通過指定目標組件名字,尋找目標組件,一般應用於調用程式和目標組件在同一個應用中的情況;
顯式Intent通過指定組件來直接調用的,Intent中可以通過下面的方式實現顯式Intent

setComponent(ComponentName name)Component類是Android系統提供的組件封裝類,需要提供包名,類名,context對象 setClassName(String packageName,String classNameInThatPackage)提供類名和本包中目標組件類名–必須是全類名,包名+類名 setClassName(Context context,String classNameInThatContext)Context對象和目標組件類名–必須是全類名,包名+類名,setClassName中會建立一個Conponent對象,而Component對象如果傳入的是context對象的話,會通過context.getPackageName()來擷取包名 setClass(Context context,Class classObjectInThatContext)Context對象和目標組件類類型,與f new Intent(MainActivity.this,OtherActivity.class); 傳遞的參數一樣

我們經常使用顯式Intent的方式是通過Intent建構函式來建立的,如下所示:
Intent intent=new Intent(MainActivity.this,OtherActivity.class);
查看原始碼可以知道,建構函式內部所做的事情是新建立了一個ComponentName對象,如:

建構函式new了一個ComponentName對象,並賦值給這個mComponent(後面都使用mComponent來指定intent建立出的ComponentName對象)。之後通過startActivity(intent)來啟動目標組件,當我們不傳遞任何參數建立Intent對象時,就需要我們手動設定ComponentName對象,與上述通過傳遞context對象和Class對象相同,代碼如下:

Intent intent=new Intent(MainActivity.this,OtherActivity.class);ComponentName com=new ComponentName("com.sujz.intent_test","com.sujz.intent_test.OtherActivity"));intent.setComponent(com)startActivity(intent);

ComponentName對象傳遞兩個參數,第一參數傳遞的是當前Activity對象所在的包名,第二個參數傳遞的是目標對象的全類名(包名+類名)
setComponentName方法實際上是給中的mComponent賦值。所以通過setComponentName方法上述方法一樣
setClassNamesetComponent類似,setClassName內部會構造一個ComponentName對象,然後賦值給mComponent對象,其他的方法不再贅述。

2.隱式Intent

隱式Intent對象是沒有指定mComponent的Intent,也就是說,在構建Intent的過程中,不會通過Intent intent=new Intent(MainActivity.this,OtherActivity.class);setComponent(ComponentName name)``setClassName(String packageName,String classNameInThatPackage)``setClass(Context context,Class classObjectInThatContext)等方式來指定ComponentName對象,注意是不會,不會,不會,重要的事情說3遍。
當沒有指定mComponent對象時,需要足夠的資訊才能夠匹配到目標組件,這些資訊包括Action,Category,Data。這3個資訊需要當前組件的Intent和目標組件的Intent都配置,只要當兩個組件的3個資訊匹配時,才會啟動目標組件,當然也可能會同時匹配到多個目標組件,這時就需要使用者自己去選擇,如下邊的栗子,就是一個Intent匹配到了多個目標組件。這種方式不僅可以啟動本應用中的相關組件,也可以啟動其他應用的相關組件,舉個栗子,當我們的手機中安裝了多個瀏覽器時,比如UC,百度等,當我們在某個應用中點擊某個連結時,是不是會跳出一個選擇框來讓你選擇使用哪個瀏覽器來開啟連結(如果沒有彈出選擇框,有兩個可能:1.你的手機只有一個瀏覽器。2.你之前勾選了預設使用該瀏覽器開啟連結)。好了,栗子舉完了。來說正事,這種方式就是通過隱式Intent來設定的。那我們要怎麼設定來啟動另外一個組件呢?繼續看。
首先我們先將目標組件的Intent設定,剛剛說到我們在匹配時,需要當前組件和目標組件都設定了Intent,目標組件的Intent設定在AndroidManifest.xml中。在這裡我們有兩個應用程式,一個是Intent_test,另一個是Host,現在從Host啟動到Intent_test,也就是說目標組件時Inent_test中的MainActivity1是目標組件,我們需要在AndroidManifest中配置如下:

                                

在目標組件的AndroidManifest中,在該Activity節點下需需要配置intent-filter節點,該節點至少需要配置一個Action和一個Category,action和Category可以有多個,只需要匹配到其中某一個即可,這裡沒有配置Data,也就是說Data可以不配置。主要這裡必須要配置原因是因為在發送intent請求的組件中預設會配置這一項。

Host中的代碼如下:

        Intent intent=new Intent();        intent.setAction("com.sujz.aa");        startActivity(intent);

可能有人會問,這裡沒有配置category,為什麼能匹配到。這是因為android在startActivity(intent)中會設定category。內部會調用intent.addCategory("android.intent.category.DEFAULT");setAction中需要傳遞目標組件的Intent-filter的action名稱。
你也可以建立自己的category,以上面為例,如下所示,在intent_test中:

                                          

在Host中:

        Intent intent=new Intent();        intent.setAction("com.sujz.aa");        intent.addCategory("android.intent.category.bb");        startActivity(intent);

不需要intent.addCategory("android.intent.category.DEFAULT");因為在startActivity(intent);已經添加了。

好了隱式Intent已經講完了

聯繫我們

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