2013-07-30 25 views
15

từ các nhà phát triển Android: "Các thành phần (dịch vụ) quảng cáo khả năng của mình - các loại intents họ có thể đáp ứng - thông qua bộ lọc ý địnhMục đích của dịch vụ Ý định-Filter trong manifest.xml

Tôi chỉ không thể hiểu mục đích của. ý định lọc bên trong dịch vụ trong manifest.xml, khả năng ở đây là gì?

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

và ông có gì khác biệt nếu tôi loại bỏ mục đích lọc?

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

cảm ơn.

Trả lời

38

Nếu bạn muốn sử dụng dịch vụ để thực hiện các hành động khác nhau, thì việc khai báo bộ lọc ý định sẽ giúp dịch vụ của bạn khớp với các hành động khác nhau mà bạn muốn thực hiện.

Ví dụ sẽ giải thích rõ hơn.
Giả sử bạn đã sau lời tuyên bố trong file manifest:

<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> 

Sau đó, trong bạn IntentService bạn có thể lọc cho những hành động như thế này:

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 
     } 
    } 
} 

Về cơ bản, nó cho phép bạn sử dụng dịch vụ tương tự cho nhau hành động, thay vì tạo hai dịch vụ riêng biệt chẳng hạn.

Tuy nhiên, có bộ lọc ý định tuyên bố một dịch vụ không được coi là một thực hành tốt, và đây là những gì các tài liệu đã nói:

Chú ý: Để đảm bảo ứng dụng của bạn được an toàn, luôn luôn sử dụng một rõ ràng ý định khi bắt đầu Dịch vụ và không khai báo các bộ lọc ý định cho các dịch vụ của bạn. Sử dụng ý định ngầm để bắt đầu một dịch vụ là một mối đe dọa an ninh vì bạn không thể chắc chắn dịch vụ nào sẽ phản hồi mục đích và người dùng không thể thấy dịch vụ nào bắt đầu.

+0

đẹp Giải thích –

+0

nhờ nó thực sự đã giúp tôi !! – joseRo

+0

Nhưng nếu tôi bắt đầu một dịch vụ như vậy với một hành động không có trong '', dịch vụ sẽ bắt đầu và thực hiện công việc của nó. Vì vậy, phải có một cái gì đó như 'if (action.equals (ACT_1)) {// Do task # 1} else if (action.equals (ACT_2)) {// Do task # 2} else {throw IllegalArgumentException (" Bất hợp pháp hành động "+ hành động);}' –

3

Bạn có thể sử dụng bộ lọc ý định để gọi một cách rõ ràng dịch vụ của bạn hoặc nhận được dịch vụ của bạn sẽ được mặc nhiên được gọi nơi các thành phần từ bất kỳ ứng dụng được cài đặt trên thiết bị của người dùng có khả năng có thể bắt đầu dịch vụ của bạn

Nếu bạn có kế hoạch về việc sử dụng dịch vụ của bạn chỉ tại địa phương (các ứng dụng khác không sử dụng nó), sau đó bạn không cần phải (và không nên) cung cấp bất kỳ bộ lọc ý định

nó được quy định rõ ràng trong tài liệu Declaring a service in the manifest

Các vấn đề liên quan