Android Service 似乎从未启动 - onStartCommand()未被调用

21

我正在尝试创建一个能够在后台处理文件输入/输出的服务。更新数据的活动将绑定到该服务并调用其方法来执行I/O操作。在此过程中,我参考了Android文档。

然而,我的服务似乎无法启动。在我的Activity的onCreate()方法中,我有以下代码:

Intent smsIntent = new Intent(this, SurveyManagerService.class);    
String surveyFilename = getIntent().getStringExtra("surveyFilename");   
System.out.println(startService(smsIntent)); //testing if it starts
SurveyManagerServiceConnection connection = new SurveyManagerServiceConnection();
sms = connection.getSurveyManagerService();

在第三行,LogCat输出一个ComponentInfo对象,因此似乎服务已经创建;然而sms为空。此外,SurveyManagerService的onStartCommand()方法似乎从未被调用:

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    System.out.println("starting service");
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    openSurveyFromIntent(intent);
    return START_REDELIVER_INTENT;
}

我从LogCat中从未看到任何“启动服务”的输出,也不会出现Toast提示。

我的服务在清单文件中声明为:

<service android:name=".SurveyManagerService" android:exported="false" android:enabled="true">
</service>

我是否遗漏了一些显而易见的东西?请让我知道我需要提供哪些其他信息来诊断问题。


也许你的服务会反复崩溃? - Reno
我该如何测试 onStartCommand() 第一行之前是否崩溃?谢谢。我忘了说 onCreate() 方法也有一个 System.out.println 测试,但从未被调用。 - Spinner
4个回答

31

请务必在 AndroidManifest.xml 文件中声明您的服务

<application>
    ...
    <service android:name=".path.to.service.MyService"/>
</application>

22

可能您不小心将服务标签放在应用程序标签之外?那么,服务就会悄悄地失败。虽然日志中应该会出现“无法启动服务意图…”的错误。


谢谢,想法不错,但 <service> 标签肯定在 <application> 标签内部。 - Spinner

6

似乎在服务实际启动之前,onCreate()方法必须退出。一旦我删除了getSurveyManagerService()请求,并且等待了一段时间,我就收到了System.out消息,表示服务正在启动。

不幸的是,这会造成另一个问题:Activity依赖于服务来获取数据,因此我需要确定如何使Activity等待服务启动。

编辑:我的解决方案是在Activity中创建一个私有子类的ServiceConnection。然后,我重写了onServiceConnected()方法,为Activity提供其数据(在这种情况下填充ListView)。


0
在我的情况下,我重构了服务类并注意到它在清单文件中没有自动重构。因此,我不得不手动更新清单文件中服务的完全限定名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接