2013-07-30 66 views
15

從Android開發者意向過濾器:「組件(服務)公佈其功能的 - 種意圖,他們可以迴應 - 通過意圖過濾服務宗旨裏面的Manifest.xml

我只是無法理解的目的。內部在manifest.xml服務意圖過濾器,什麼是能力嗎?

<service 
    android:name="com.x.y" 
    android:enabled="true" 
    android:exported="true" > 
    <intent-filter> 
     <action android:name="com.x.y" /> 
    </intent-filter> 
</service> 

,什麼是他的區別,如果我刪除的意圖過濾器?

<service 
     android:name="com.x.y" 
</service> 

謝謝。

回答

38

如果您想使用服務執行不同的操作,那麼聲明意圖過濾器將有助於您的服務與您要執行的不同操作相匹配。

這個例子會更好地解釋。
假設你有以下清單文件聲明:

public class MyService extends IntentService { 

    public MyService() { 
     super("MyService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if(intent.getAction().equals("com.x.y.DOWNLOAD_DATA"){ 
      //download data here 
     }else if(intent.getAction().equals("com.x.y.UPLOAD_DATA"){ 
      // upload data here 
     } 
    } 
} 

基本上,它可以讓你用不同的相同的服務:

<service 
    android:name="MyService" > 
    <intent-filter> 
     <action android:name="com.x.y.DOWNLOAD_DATA" /> 
     <action android:name="com.x.y.UPLOAD_DATA" /> 
    </intent-filter> 
</service> 
IntentService你可以爲這些行動這樣的過濾

然後行動,而不是創建兩個單獨的服務,例如。

然而,在宣佈對服務的意圖過濾器不被視爲一個很好的做法,這就是文檔說的話:

注意:爲確保您的應用程序是安全的,總是用一個明確的意圖 開始服務時,並且不要爲您的 服務聲明意圖過濾器。使用隱式意圖來啓動服務是一種安全隱患,因爲您無法確定哪些服務將對 意圖做出響應,並且用戶無法看到哪個服務啓動。

+0

好的交代 –

+0

感謝它真的幫助了我! – joseRo

+0

但是,如果我使用''中未包含的操作啓動這樣的服務,服務將啓動並完成其工作。所以,應該有像if(action.equals(ACT_1)){//做任務#1} else if(action.equals(ACT_2)){//做任務#2} else {throw IllegalArgumentException(「Illegal行動「+動作);}' –

3

您可以使用意圖過濾器的顯式調用您的服務或讓你的服務被隱式調用其中來自安裝在用戶的設備上的任何應用程序組件有可能啓動服務

如果你打算使用你的服務僅在本地(其它應用程序不使用它),那麼你就不需要(也不應該)提供任何意圖過濾

它在文檔中明確規定Declaring a service in the manifest