23

来自 android 开发人员:“组件(服务)通过意图过滤器宣传他们的能力——他们可以响应的意图类型。

我只是无法理解 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>

谢谢。

4

2 回答 2

48

如果您想使用服务来执行不同的操作,那么声明一个意图过滤器将帮助您的服务匹配您想要执行的不同操作。

该示例将更好地解释。
假设您在清单文件中有以下声明:

<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你可以像这样过滤这些操作:

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

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

但是,为服务声明意图过滤器并不被认为是一种好的做法,这就是文档必须说的:

注意:为确保您的应用程序安全,请始终在启动服务时使用显式意图,并且不要为您的服务声明意图过滤器。使用隐式意图启动服务是一种安全隐患,因为您无法确定哪个服务会响应该意图,并且用户无法看到哪个服务启动。

于 2013-07-30T07:14:23.083 回答
5

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

如果您计划仅在本地使用您的服务(其他应用程序不使用它),那么您不需要(也不应该)提供任何意图过滤器

在文档中明确指定了在清单中声明服务

于 2013-07-30T07:20:26.250 回答