无法通过IMPLICIT意图启动意向服务

时间:2016-07-26 20:16:44

标签: android android-intent android-service intentservice

的AndroidManifest.xml

<application android:name=".MyApplication"
         android:icon="@drawable/icon"
         android:label="@string/app_name"
         >

 <service android:name=".MyService"
          android:exported="true">
          <intent-filter>
            <action android:name="android.service.myapp.MyService.actionA"/>
            <action android:name="android.service.myapp.MyService.actionB"/>
            <category android:name="android.intent.category.DEFAULT"/>
          </intent-filter>

 </service>

</application>

如果我使用以下代码,我的服务将启动:

Intent intent = new Intent(context, MyService.class);
intent.setAction("android.service.myapp.MyService.actionA");
context.startService(intent);

但如果我使用此代码启动它,我的服务就无法启动:

Intent intent = new Intent("android.service.myapp.MyService.actionA");
context.startService(intent);

1 个答案:

答案 0 :(得分:3)

使用“隐式”Intent来启动或绑定Service是不安全的。从Lollipop开始,bindService()需要一个明确的Intent(您的第一个示例,其中为Context指定ClassService。{{{}的行为对于用于启动服务的隐式startService(),未定义1}}。来自Intent的文档:

  

Intent应该包含要启动的特定服务实现的完整类名或要定位的特定包名。如果指定的Intent较少,它会记录一个关于此的警告以及它找到和使用的多个匹配服务中的哪一个将是未定义的。

如果您使用显式表单,则可以从清单中完全删除startService():不需要它。如果您需要通过<intent-filter>指定服务要完成某种类型的工作,请考虑在Intent内使用额外内容。