Manifest.xml中的服务Intent-Filter的目的

jos*_*eRo 20 android

来自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>
Run Code Online (Sandbox Code Playgroud)

如果我删除了intent-filter,他的区别是什么?

 <service
       android:name="com.x.y"
 </service>
Run Code Online (Sandbox Code Playgroud)

谢谢.

And*_*Res 43

如果要使用服务执行不同的操作,则声明意图过滤器将帮助您的服务与您要执行的不同操作相匹配.

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

<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>
Run Code Online (Sandbox Code Playgroud)

然后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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

警告:为确保您的应用程序安全,请始终在启动服务时使用明确的意图,并且不要为您的服务声明意图过滤器.使用隐式意图启动服务存在安全隐患,因为您无法确定哪些服务将响应意图,并且用户无法查看启动哪个服务.


anz*_*anz 5

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

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

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