2011-12-31 4 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> 

Финлей, чтобы начать свою службу, Я называю метод startService в onCreate:

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

И ничего не происходит. Если я проверю запущенные службы устройства, нет службы с именем ServiceSyncho. Если я проверю Logcat, ничего не выводится. То же самое для точек останова, приложение не циклично перебирает события жизненного цикла службы. Любая идея, что может быть моей проблемой?

+0

Вы можете попробовать внедрить Service.onStartCommand (..), чтобы узнать, вызвано ли оно как минимум. – harism

ответ

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 для его просмотра.

андроид: имя Имя подкласса Service, который реализует службу. Это должно быть полное имя класса (например, com.example.project.RoomService). Однако в качестве сокращения, если первым символом имени является период (например, «.RoomService»), он добавляется к имени пакета, указанному в элементе.

Наконец, я обновил код, чтобы переопределить команду onStartCommand, поскольку метод onStart устарел.

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

Я искал всюду, когда мое обслуживание не начиналось. Ничего не получилось. Наконец-то отладка третьего часа ı выяснила, что имя моего пакета не было стандартным форматом xx.xx.xx. Я исправил и работал. Для информации.

Смежные вопросы