无法通过 IMPLICIT 意图启动意图服务
Unable to start intent service via IMPLICIT intent
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);
使用 "implicit" Intent
启动或绑定 Service
是不安全的。从 Lollipop 开始,bindService()
需要一个明确的 Intent
(您的第一个示例,您为 Service
指定 Context
和 Class
。)[= 的行为17=] 未定义用于启动服务的隐式 Intent
。来自 startService()
的文档:
The Intent should contain either contain the complete class name of a specific service implementation to start or a specific package name to target. If the Intent is less specified, it log a warning about this and which of the multiple matching services it finds and uses will be undefined.
如果您使用显式形式,您可以从清单中完全删除 <intent-filter>
:不需要。如果您需要通过 Intent
指定服务要完成的某些类型的工作,请考虑在 Intent
.
中使用额外的内容
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);
使用 "implicit" Intent
启动或绑定 Service
是不安全的。从 Lollipop 开始,bindService()
需要一个明确的 Intent
(您的第一个示例,您为 Service
指定 Context
和 Class
。)[= 的行为17=] 未定义用于启动服务的隐式 Intent
。来自 startService()
的文档:
The Intent should contain either contain the complete class name of a specific service implementation to start or a specific package name to target. If the Intent is less specified, it log a warning about this and which of the multiple matching services it finds and uses will be undefined.
如果您使用显式形式,您可以从清单中完全删除 <intent-filter>
:不需要。如果您需要通过 Intent
指定服务要完成的某些类型的工作,请考虑在 Intent
.