意图过滤器无法解析外部服务

时间:2013-02-25 16:39:57

标签: android android-intent android-service

我遗失了一些必要或......

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

<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);

我在null中获得cn(服务无法解析)。但如果我把它改为:

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上看到了许多包含第一个变体的建议,但我无法使其工作。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

在您的代码中,您首先将构造函数中的操作设置为“my.service”。这可行,但在下一行中,您将操作设置为“my.command”。如果您需要向同一服务发送不同的操作,则还必须将该操作添加到清单中的intent-filter:

<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>

答案 1 :(得分:0)

文件说:

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

我意识到使用“绑定”whith服务的简单教程(法语): http://julien-dumortier.fr/service-et-binding-sous-android/ 也许它会有所帮助

答案 2 :(得分:0)

Try the following in your activity oncreate()

 intent = new Intent(this, BackHelper.class);

 startService(intent);

In manifest try

 service android:name=".BackHelper" 

答案 3 :(得分:0)

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

<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();