在服务中为什么不声明意图过滤器?

时间:2016-07-26 06:43:12

标签: android intentfilter

https://developer.android.com我发现以下声明。

警告:为避免无意中运行其他应用的服务,请始终使用明确的意图来启动您自己的服务,并且不要为您的服务声明意图过滤器。

请告诉我为什么不为我的服务声明意图过滤器?

2 个答案:

答案 0 :(得分:1)

让我试着回避上面的句子,以明确其含义:

  

警告:为避免无意中运行其他应用的服务,请始终使用显式意图来启动您自己的服务......

当您广播隐式意图时,Android会检查注册了哪些应用程序以接收此Intent。多个应用程序可以注册到同一个Intent,在这种情况下,如果您的目的是仅启动自己的服务而另一个服务注册到同一个Intent Action,则Android可能启动另一个服务而忽略您的服务。

  

始终使用明确的意图来启动您自己的服务,并且不为您的服务声明意图过滤器。

为了避免上述情况,Android允许使用显式Intent启动您的服务。在您的显式Intent中,您提供了需要启动的确切包名称和Service类。这样,Android就可以精确定位您的服务并启动它,而不会将其与可能安装在设备上的其他服务混淆。此外,当使用显式Intent时,您不需要为该Intent注册一个Intent过滤器,因为Android知道该做什么以及启动哪个Service,因为所有需要的信息都封装在Intent中。

以下是明确意图的示例:

Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

当您创建Intent时,您可以通过传递"这个"来提供应用程序的上下文(进程)。作为一个论点。此外,您传递服务的确切类名(DownloadService.class)。现在,Android确切地知道要启动哪个服务,并且不会与多个选择混淆。

答案 1 :(得分:0)

因为有可能启动属于某个其他应用程序的服务并具有相同的intent过滤器。

用户可以在他的设备上拥有另一个应用程序(可能不止一个),该应用程序可以使用相同的意图过滤器进行服务。如果您发送广播意图试图运行您的服务,您可能会意外地运行此应用程序的服务。