Manifest.xml中的Service Intent-Filter的目的

来自android开发者:“组件(服务)通过意图filter宣传他们的能力 – 他们可以响应的意图种类。

我只是无法理解Manifest.xml中的服务内部意图过滤的目的,这里的function是什么?

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

和他有什么不同,如果我删除意图filter?

  <service android:name="com.xy" </service> 

谢谢。

Solutions Collecting From Web of "Manifest.xml中的Service Intent-Filter的目的"

如果您想使用服务来执行不同的操作,那么声明一个意图filter将有助于您的服务与您要执行的不同操作相匹配。

这个例子会更好地解释。
假设您在清单文件中有以下声明:

 <service android:name="MyService" > <intent-filter> <action android:name="com.xyDOWNLOAD_DATA" /> <action android:name="com.xyUPLOAD_DATA" /> </intent-filter> </service> 

然后在您的IntentService您可以筛选这些操作:

 public class MyService extends IntentService { public MyService() { super("MyService"); } @Override protected void onHandleIntent(Intent intent) { if(intent.getAction().equals("com.xyDOWNLOAD_DATA"){ //download data here }else if(intent.getAction().equals("com.xyUPLOAD_DATA"){ // upload data here } } } 

基本上,它允许您为不同的操作使用相同的服务,而不是创build两个单独的服务。

但是,为服务声明filter并不被认为是一种好的做法,这就是文档不得不说的:

小心:为了确保您的应用程序安全,请始终在启动服务时使用明确的意图,并且不要为您的服务声明意图filter。 使用隐含的意图来启动一个服务是一个安全隐患,因为你不能确定什么样的服务会响应这个意图,而用户不能看到哪个服务启动。

您可以使用意图filter显式调用您的服务,或者让您的服务隐式调用,其中安装在用户设备上的任何应用程序的组件都可以启动您的服务

如果你打算只在本地使用你的服务(其他应用程序不使用它),那么你不需要(也不应该)提供任何意图filter

在清单中声明服务的文档中明确指出了这一点