【问题标题】:Why Service Intent Needs to be Explicit Intent为什么服务意图需要显式意图
【发布时间】:2015-09-07 11:54:05
【问题描述】:

当我们启动如下服务时:

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

它给出一个错误:服务意图必须是明确的。

为什么会这样。为什么android需要明确的服务意图?

【问题讨论】:

  • security ...如果有多个活动对同一意图做出反应,则要求用户选择一个...现在,想象一下它如何为服务工作(我不能)...这就是为什么你必须指出确切的组件名称
  • @selvin 它适用于 pre v5(我相信)版本,所以它可以工作......
  • “它工作” ...你的意思是随机或所有马赫会运行的服务......糟糕,糟糕的 android :)
  • @Selvin 我相信在这种情况下没有服务启动(好好的 android)

标签: android android-fragments android-intent


【解决方案1】:

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

如果恶意服务绑定到调用应用程序,那么攻击者可以返回任意恶意数据 或者只是返回一个成功的结果而不采取请求的操作。这 恶意服务可以窃取数据并谎报完成 请求的动作。

【讨论】:

    【解决方案2】:

    更多一点: 如果我们想使用 Implicit Intent(With Action Name),我们必须像这样使用 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);
    

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

    【讨论】:

      【解决方案3】:

      “为确保您的应用安全,请始终在启动或绑定您的服务时使用明确的意图,并且不要为服务声明意图过滤器。”(From Android developer) 一定是因为没有它其他应用程序将可以启动您的服务等。

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 2012-05-15
        相关资源
        最近更新 更多