服务意图必须明确

Service Intent Must Be Explict

我正在尝试启动具有预定义操作的服务,但出现以下错误:

java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.radioafrica.music.action.TOGGLE_PLAYBACK }
        at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1745)
        at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1774)
        at android.app.ContextImpl.startService(ContextImpl.java:1758)
        at android.content.ContextWrapper.startService(ContextWrapper.java:515)
        at com.radioafrica.music.activity.MusicPlayer.onClick(MusicPlayer.java:70)
        at android.view.View.performClick(View.java:4763)
        at android.view.View$PerformClick.run(View.java:19821)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5272)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

我用来尝试启动 Intent 的代码如下:

 Intent serviceIntent = new Intent(MusicService.ACTION_PLAY);
 startService(serviceIntent);

这也行不通;

startService(new Intent(MusicService.ACTION_PLAY);

我也已经在清单中包含了适当的意图过滤器。

在 Android 5.0+ 上,您无法再通过隐式 Intent 使用 bindService() 绑定到服务。隐式 Intent 是您使用操作字符串之类的东西,而不是在您希望绑定到的特定应用程序中识别特定 Java class。

您有几个选择,包括:

  1. startService() 不受影响,因此您可以将与服务交互的协议更改为命令模式,而不是绑定模式,并且您可以坚持使用现有的 Intent.

  2. 如果这是您自己的服务,请去掉 <intent-filter>,并使用将 Java class 作为第二个参数(例如 new Intent(this, MusicThingyService.class))。在服务上使用 <intent-filter> 的唯一原因是您希望第三方使用该服务。

  3. 如果您知道托管所需服务的应用程序的应用程序 ID,则在您正在使用的 Intent 上调用 setPackage() 将使它成为 "explicit enough"满足bindService().

  4. 您可以使用 PackageManagerqueryIntentServices() 来查找服务实现。如果没有匹配服务(例如,您的合作伙伴应用程序未安装)、多个匹配服务(例如,其他人试图拦截通信)或伪装成匹配服务的恶意软件(通过检查其他应用程序的签名)。我在 this sample app.

  5. 中演示了这种方法