【问题标题】:Why is using an implicit intent to start a service not safe?为什么使用隐式意图启动服务不安全?
【发布时间】:2014-02-19 07:04:05
【问题描述】:

当我以隐式意图启动服务时,我会收到警告:

使用 startservice 的隐式意图并不安全:...

为什么?

编辑:

我正在使用我自己的内部类别,其他应用程序不应该使用,并且我的服务未导出android:exported="false"

【问题讨论】:

  • 防止碰撞...其他应用程序可能有Services 接受相同的意图操作...
  • @GopalRao 但如果我使用特定于应用程序的类别,则不会。
  • 但是如果发生类别冲突怎么办? (非常罕见的情况)。 Android系统不会要求用户选择启动哪个Service...
  • 这听起来像是 Android 错误或疏忽。

标签: android android-intent intentfilter


【解决方案1】:

通过使用Implicit Intents,您没有指定组件,这意味着该组件将由Android 通过给定的Intent-Action 选择。

使用android:exported="false" 将确保,其他无法启动您的服务。但是,如果我用BroadcastReeciver 编写了一个应用程序来监听你的Intent-Action 并做一些恶意工作怎么办?

当我在我的应用程序中声明一个服务并使用相同的类别/过滤器/操作时,也会发生同样的情况。

所以使用Explicit Intents

【讨论】:

  • 我使用了一个我有一天会公开的内部类别。
  • 我不在乎你是否添加了一个“恶意”应用程序来获取我的服务意图,你打算做什么...在我的服务启动时记录?你可以问系统。我的意图中没有敏感数据。
  • 那就不用担心了。这只是一个警告,你可以忽略它:)
  • @PankajKumar 我正在使用 android 许可证检查代码 (LVL),用于使用此“new Intent("com.android.vending.licensing.ILicensingService")”的绑定服务。获得相同的警告和服务无法启动。仅适用于 4.0 及更高版本的设备。
  • 这没有任何意义。这是整个意图点,允许您指定您想要完成的任务而不是您想要执行的操作,因此用户可以选择使用哪个应用程序来完成任务。强制应用程序包含组件名称会破坏整个观点。这不仅仅是“警告”,5.0 完全打破了这一点。
【解决方案2】:

如果你有多个 Service(s) 使用相同的 IntentFilter,系统不知道应该启动哪一个,系统不会要求用户选择。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多