的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);
答案 0 :(得分:3)
使用“隐式”Intent
来启动或绑定Service
是不安全的。从Lollipop开始,bindService()
需要一个明确的Intent
(您的第一个示例,其中为Context
指定Class
和Service
。{{{}的行为对于用于启动服务的隐式startService()
,未定义1}}。来自Intent
的文档:
Intent应该包含要启动的特定服务实现的完整类名或要定位的特定包名。如果指定的Intent较少,它会记录一个关于此的警告以及它找到和使用的多个匹配服务中的哪一个将是未定义的。
如果您使用显式表单,则可以从清单中完全删除startService()
:不需要它。如果您需要通过<intent-filter>
指定服务要完成某种类型的工作,请考虑在Intent
内使用额外内容。