为什么Service意图需要是显式意图?

6
当我们启动以下服务时:

```service abc start```

Intent in = new Intent();
in.setAction("com.android.myAction");
startService(in);

它报错:Service Intent必须是显式的。为什么会这样呢?为什么Android要求Service Intent必须是显式的?

2
安全性...如果有多个活动响应同一意图,用户将被要求选择一个...现在,试想一下它如何适用于服务(我无法)...这就是为什么您必须指定确切的组件名称。 - Selvin
http://developer.android.com/guide/components/intents-filters.html - Sree
1
@selvin,它适用于v5之前的版本(我相信),所以它可能有效... - pskink
它运作了,你是指随机还是所有匹配的服务都会运行?糟糕,糟糕的安卓 :) - Selvin
@Selvin 我相信在这种情况下没有服务启动(好好的安卓)。 - pskink
显示剩余2条评论
3个回答

2

当您使用隐式意图启动服务时,与Activity不同,没有用户界面参与。当多个服务可以处理Intent时,Android会随机选择一个;用户不需要选择服务。

如果恶意服务绑定到调用应用程序,则攻击者可以返回任意恶意数据或仅返回成功结果而不执行所需操作。 恶意服务可以窃取数据并虚假陈述已完成请求的操作。


1
稍微解释一下: 如果我们想使用隐式意图(带有操作名称),我们必须像这样使用setPackageName:
Intent intent = new Intent();
intent.setPackage("com.action.ServicePackageName");
intent.setAction("com.action.ActionNameOfService");
bindService(intent, yourServiceConectionObject, Service.BIND_AUTO_CREATE);
//or
//startService(intent);

需要注意的是,如果服务是本地服务,则应该使用显式意图,因为服务类对您可用。我们也可以像上面展示的那样使用相同的方式,但出于某些答案中提到的相同原因,建议使用显式意图。对于远程服务(其他应用程序中的服务);由于服务类不可用,我们只能以这种方式绑定服务。

1
"为确保您的应用程序安全,请始终在启动或绑定服务时使用显式意图,并且不要为服务声明意图过滤器。"(来自Android开发人员) 这是因为如果没有它,其他应用程序将能够启动您的服务等。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接