【问题标题】:External service can not be resolved by intent filter意图过滤器无法解析外部服务
【发布时间】:2013-02-25 16:39:57
【问题描述】:

我遗漏了一些重要的东西或者......

我有两个应用程序,其中一个包含导出的服务,并在 AndroidManifest 中声明了意图过滤器:

<service
    android:name=".MyService"
    android:exported="true"
    android:permission="my.permission" >
    <intent-filter>
        <action android:name="my.service" />
    </intent-filter>
</service>

我可以通过使用“my.service”操作成功地从另一个应用程序绑定到该服务。但我想启动服务(向它发送命令)。如果我写:

Intent intent = new Intent("my.service");
intent.setAction("my.command");
ComponentName cn = startService(intent);

我在cn 中得到null(服务无法解决)。但是,如果我将其更改为:

PackageManager packageManager = getPackageManager();
Intent serviceIntent = new Intent("my.service");
List<ResolveInfo> services = packageManager.queryIntentServices(serviceIntent, 0);
if (services.size() > 0) {
    ResolveInfo service = services.get(0);
    intent = new Intent();
    intent.setClassName(service.serviceInfo.packageName, service.serviceInfo.name);
    intent.setAction("my.command");
    ComponentName cn = startService(intent);
}

服务已成功启动。我在 StackOverflow 上看到了很多包含第一个变体的建议,但我无法让它发挥作用。有什么想法吗?

【问题讨论】:

    标签: android android-intent android-service


    【解决方案1】:

    在不起作用的代码中,您首先将构造函数中的操作设置为“my.service”。这会起作用,但是在下一行中,您将您的操作设置为“my.command”。如果您需要向同一服务发送不同的操作,您还必须将该操作添加到清单中的意图过滤器:

    <service
        android:name=".MyService"
        android:exported="true"
        android:permission="my.permission" >
        <intent-filter>
            <action android:name="my.service" />
            <action android:name="my.command" />
        </intent-filter>
    </service>
    

    【讨论】:

    • 该死!我总是犯同样的错误,认为动作和名称是不同的实例。感谢您再次指出显而易见的事情。
    【解决方案2】:

    文档说:

    如果服务正在启动或已经在运行,则返回实际启动的服务的 ComponentName;否则,如果服务不存在,则返回 null。

    我实现了一个使用“绑定”服务的简单教程(法语): http://julien-dumortier.fr/service-et-binding-sous-android/ 也许会有所帮助

    【讨论】:

      【解决方案3】:
      Try the following in your activity oncreate()
      
       intent = new Intent(this, BackHelper.class);
      
       startService(intent);
      
      In manifest try
      
       service android:name=".BackHelper" 
      

      【讨论】:

        【解决方案4】:

        在您的清单中添加以下内容

        <service 
        ....
        android:name="the package name of your service that you imported from another project">
        ....
        </service>
        

        在您的活动中,

        //start service on create
        ComponentName cn = startService(new Intent(this,service_file_you_imported.class));
        
        //Binding the activity to the service 
        doBindService();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          • 2017-02-24
          • 2017-09-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多