我遗失了一些必要或......
我有两个应用程序,其中一个包含带有在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上看到了许多包含第一个变体的建议,但我无法使其工作。有什么想法吗?
答案 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();