2011-12-31 270 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軟件包的名稱。我修復了它並且工作正常。 供您參考。