2010-05-26 81 views
39

使用android我意識到隱式意圖在大多數情況下都是很好的選擇,因爲它們的靈活性。但是,明確的意圖是什麼? 使用它們有什麼好處?什麼是常見情況下,使用它們是一種很好的做法?Android隱式意圖VS顯式意圖

回答

87

隱式Intents不直接指定應該調用的Android組件,它只指定要執行的操作.Uri可以與隱式意圖一起使用以指定數據類型。

例如

Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com");

這將導致Web瀏覽器來打開被註冊爲具體行動的所有組件的網頁.Android系統搜索和type.If許多組件的數據中發現,則用戶可以選擇使用哪個組件。

顯式意圖用於應用程序本身,其中一個活動可以切換到其他活動...示例Intent intent = new Intent(this,Target.class);這會導致活動從當前上下文切換到目標活動。 顯式意圖也可用於傳遞利用putExtra方法數據到其它活動和由getIntent()由目標活動檢索。getExtras()方法...

希望這有助於...

+0

隱式意圖的另一個例子是攝像機意圖,相機意圖將提示打開相機,它可以是任何相機安裝在手機中的應用程序。 – 2017-08-09 12:38:16

22

您通常使用顯式意圖在自己的應用程序中啓動活動。那時你確切地知道你想要開始哪個活動,所以沒有理由去完成額外的設置隱式意圖的工作。

15
  1. 顯式意圖用於調用特定的組件。當您知道要啓動哪個組件時,並且不想讓用戶自由控制要使用哪個組件。例如,您有一個具有2個活動的應用程序。活動A和活動B.您想從活動A啓動活動B.在這種情況下,您可以定義明確的目標活動B,然後使用它直接調用它。

  2. 當你知道你想要做什麼,但你不知道應該啓動哪個組件時,使用隱式意圖。或者如果您想讓用戶在要使用的組件列表中進行選擇的選項。如果這些Intents被髮送到Android系統,它將搜索爲特定操作和數據類型註冊的所有組件。如果只找到一個組件,Android會直接啓動組件。例如,您有一個使用相機拍攝照片的應用程序。您的應用程序的一個特點是,您可以讓用戶發送他拍攝的照片。您不知道用戶具有哪種可以發送照片的應用程序,並且您還想讓用戶選擇使用哪個外部應用程序(如果他有多個應用程序)。在這種情況下,你不會使用明確的意圖。相反,您應該使用隱式意圖,將其操作設置爲ACTION_SEND,並將其數據額外設置爲照片的URI。

    明確的意圖總是傳遞給它的目標,不管它包含什麼;沒有諮詢過濾器。但是一個隱含的意圖傳遞到一個組件,只有當它能夠通過組件的過濾器

10

1)明確意圖之一:組件名開發人員知道這樣,名字意圖指定。

2)隱式意圖:未在Intent中指定組件。

+0

簡短,直接點。 – domen 2014-08-14 12:52:21

+2

該問題明確要求用例。定義是不夠的。 – 2015-06-19 05:28:56

0
  1. 隱性意圖 - 當我們想要調用通過意圖系統組件以執行特定的任務,我們不要」 t確實知道要使用的組件的名稱,android系統將顯示所需的應用程序列表以執行任務。
  2. 明確意圖 - 當我們要調用的另一個活動與活動的全限定名,當然我們知道活動的名稱。
2

Docs

有兩種類型的意圖的:

  • 明確意圖指定由名稱(完全合格的類名)啓動組件。您通常會使用明確的意圖在自己的應用程序中啓動組件,因爲您知道要啓動的活動或服務的類名稱。例如,您可以啓動新的活動以響應用戶操作或啓動服務以在後臺下載文件。
  • 不名的特定組成部分,而是隱含的意圖聲明來執行一般的動作,這使得從其他應用程序的組件來處理它。例如,如果你想顯示用戶在地圖上的位置,你可以使用一個隱含的意圖請求另一個能夠應用顯示在地圖上的指定位置。
0

隱式意圖不直接指定Android組件應該被調用,它僅規定動作要performed.An烏里可以用隱含意圖被用來指定數據類型。

例如

意向意圖=新意圖(ACTION_VIEW,Uri.parse( 「http://www.google.com」);

這將導致Web瀏覽器打開一個網頁.Android系統搜索其註冊的所有組件對於特定的操作和數據類型。如果發現許多組件,則用戶可以選擇使用哪個組件。

顯式意圖用於應用程序本身,其中一個活動可以切換到其他活動...示例Intent intent = new Intent(this,Target.class);這會導致acti的切換從當前環境到目標活動的虛幻。顯式意圖也可用於傳遞使用putExtra方法數據到其它活動和getIntent()的目標活動檢索。getExtras()方法...

0

當你知道,當你不知道

明確意圖:使用明確意圖,當你確切地知道哪些活動可以處理您的請求。
很常見的例子就是,你有一個列表的活動,當你在列表中單擊一個項目它會打開一個詳細的活動。在這種情況下,你知道的細節OD列表項,可以顯示或通過DetailActivity.class(或com.yourpackage處理。DetailActivity)的應用程序。 所以您可以通過給出完整的包名開始活動

startActivity(this,com.yourPackage.DetaiActivy.class); 

隱性意圖:當你不知道哪些活動,其中應用程序可以處理您的請求(ACTION)。然後你將任務交給操作系統。
例如:您有歌曲項目列表,當您單擊任何項​​目時,應該播放這首歌曲。你不知道誰可以處理你的請求,所以你讓操作系統爲你決定。

在這種情況下
1)你寫意圖
2)添加動作
3)啓動活動

intent intent = new Intent(); 
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(songPath); 

如何OS決定?

有一個術語叫做意圖解析。
In Intent解決方案OS取出您的意圖中指定的Action並進入PackageManager並使用設備中安裝的所有應用程序的意向過濾器查找所有已註冊的活動。那麼它會顯示彈出的相應應用程序列表。 所以寫一個隱含的意圖安全的方法是這樣的

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(songPath); 
if (intent.resolveActivity(getPackageManager()) != null) { 
    startActivity(intent); 
} 

如何使彈出的列表中您的應用程序得到什麼?

比方說,你在文件瀏覽器,你點擊一個音樂文件,然後一個隱式的意圖得到觸發與一些行動和額外的數據。 如果您希望將應用程序添加到應用程序列表中,則必須使用AndroidManifest.xml文件中的操作註冊意圖過濾器。喜歡這個。

<application 
    ..... > 

    ...... 
    <activity android:name=".MusicActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <data android:type="audio/*" /> 
     </intent-filter> 
    </activity> 
..... 


</application> 

參考
Common Intents and action list
More on Intent filters and Intent resolution