:“组件(服务)通过意图过滤器宣传他们的能力 - 他们可以响应的意图类型。”
我只是无法理解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>
如果我删除了intent-filter,他的区别是什么?
<service
android:name="com.x.y"
</service>
感谢。
答案 0 :(得分:42)
如果您想使用服务执行不同的操作,则声明意图过滤器将有助于您的服务与您要执行的不同操作相匹配。
这个例子会更好地解释 假设您在清单文件中有以下声明:
<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
}
}
}
基本上,它允许您对不同的操作使用相同的服务,而不是创建两个单独的服务。
但是,为服务声明的意图过滤器并不被视为一种好习惯,这就是文档所说的:
警告:为确保您的应用安全,请始终使用明确的意图 启动服务时,不要为您的声明声明意图过滤器 服务。使用隐式意图启动服务是一种安全性 危险,因为你不能确定什么服务会响应 意图,用户无法查看哪些服务启动。
答案 1 :(得分:3)
您可以使用意图过滤器显式调用您的服务,或者隐式调用您的服务,其中来自用户设备上安装的任何应用程序的组件都可能启动您的服务
如果您打算仅在本地使用您的服务(其他应用程序不使用它),那么您不需要(也不应该)提供任何意图过滤器
中明确指出了这一点