2011-12-31 226 views
0

我正面临一个奇怪的问题。我想在创建活动时启动服务。这里是我服务的代码(很简单,因为你会看到):Android服务无法启动

package com.nblmedia.service; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 

public class ServiceSynchro extends Service { 

public ServiceSynchro() 
{ 
    Log.i(XXX.LOG, "ServiceSynchro"); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    Log.i(XXX.LOG, "onBind"); 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    Log.i(XXX.LOG, "onCreate"); 
    super.onCreate(); 
} 

@Override 
public void onDestroy() { 
    Log.i(XXX.LOG, "onDestroy"); 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 
} 

在我的AndroidManifest.xml我已经宣布了服务如下:

<service android:name=".ServiceSynchro"></service> 

Finaly,开始我的服务,我在onCreate中调用startService方法:

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    startService(new Intent(UserMenuActivity.this, ServiceSynchro.class));  
} 

没有任何反应。如果我检查设备的运行服务,则没有名为ServiceSyncho的服务正在运行。如果我检查Logcat,则不输出任何内容。相同的断点,应用程序不会循环通过服务的生命周期事件。任何想法可能是我的问题?

+0

您可以尝试实施Service.onStartCommand(..)以查看它是否至少被调用。 – harism 2011-12-31 21:13:47

回答

5

摆脱你的构造函数。切勿在组件中实现构造函数(当前唯一的例外:IntentService)。

另外,当你在Java的其他地方实现构造函数时,链接到超类。

8

我发现了这个问题。在我的AndroidManifest.xml文件中,service:name属性没有引用服务的完全限定类名。作为例子,我用的是这样的:

<service android:name=".ServiceSynchro"></service> 

当我需要:

<service android:name="com.xxx.service.ServiceSynchro"></service> 

对于有意从文档,here is the link的应用程序来查看它的人。

的android:命名 实现服务的服务子类的名称。这应该是一个完全限定的类名(例如“com.example.project.RoomService”)。但是,如果名称的第一个字符是一个句点(例如,“.RoomService”),那么它会附加到元素中指定的包名称。

最后,我更新了代码以覆盖onStartCommand命令,因为onStart方法已被弃用。

public int onStartCommand(Intent intent, int flags, int startId) 
0

当我的服务没有启动时,我到处寻找。 什么都没有解决。最后第三个小时的调试发现我的软件包名称不是标准格式xx.xx.xx软件包的名称。我修复了它并且工作正常。 供您参考。