Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之Intent使用

Android之Intent使用

編輯:關於Android編程

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與隱式Intent

1.顯式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對象和目標組件類類型,與fnew Intent(MainActivity.this,OtherActivity.class); 傳遞的參數一樣

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

構造函數new了一個ComponentName對象,並賦值給這個mComponent(後面都使用mComponent來指定intent創建出的ComponentName對象)。之後通過startActivity(intent)來啟動目標組件,當我們不傳遞任何參數創建Intent對象時,就需要我們手動設置ComponentName對象,與上述通過傳遞context對象和Class對象相同,代碼如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> 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已經講完了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved