我在从其他Android应用(API 17)启动服务时遇到问题。 但是,如果我从shell运行'am',服务就会正常运行。
# am startservice com.xxx.yyy/.SyncService
Starting service: Intent { act=android.intent.action.MAIN cat=
[android.intent.category.LAUNCHER] cmp=com.xxx.yyy/.SyncService }
(service starts fine at this point)
# am to-intent-uri com.xxx.yyy/.SyncService
intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;
component=com.xxx.yyy/.SyncService;end
所以,当我在代码中执行相同操作时,看起来我并没有遗漏任何意图:
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setComponent(new ComponentName("com.xxx.yyy", ".SyncService"));
ComponentName c = ctx.startService(i);
if (c == null) { Log.e(TAG, "failed to start with "+i); }
我得到的是(该服务当时没有运行):
E/tag( 4026): failed to start with Intent {
act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER]
cmp=com.xxx.yyy/.SyncService }
我没有关于服务的意图过滤器,我不想设置一个,我真的想通过它的组件名称或者可能正在做什么来理解我做错了什么不可能这样做。
答案 0 :(得分:41)
您应该可以像这样开始服务:
Intent i = new Intent();
i.setComponent(new ComponentName("com.xxx.yyy", "com.xxx.yyy.SyncService"));
ComponentName c = ctx.startService(i);
如果要指定特定组件,则不需要设置ACTION或CATEGORY。确保在清单中正确定义了您的服务。
答案 1 :(得分:0)
像这样启动您的服务
Intent intent = new Intent();
intent.setComponent(new ComponentName("pkg", "cls"));
ComponentName c = getApplicationContext().startForegroundService(intent);
顺便说一句,您实际上需要使用applicationId而不是pkg。它可以在应用程序gradle中找到。我在那个错误中挣扎了好几个小时!
defaultConfig {
applicationId "com.xxx.zzz"
}
cls是清单中声明的服务名称。例如:com.xxx.yyy.yourService。
<service android:name="com.xxx.yyy.yourService"
android:exported="true"/>