2012-04-03 15 views
7

Mam usługa z następującym konstruktora:Jak utworzyć instancję usługi Android za pomocą konstruktora?

public ShimmerService(Context context, Handler handler) { 
    mHandler = handler; 
} 

chcę instancję tej klasy usług. Mam następujący kod, ale nie jestem pewien, gdzie przekazać paramater:

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder binder) { 
     mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder) 
       .getService(); 
     Toast.makeText(ConfigureShimmer.this, 
       "Shimmer service has succesfully started.", 
       Toast.LENGTH_SHORT).show(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mShimmerService = null; 
    } 
}; 

mam wszystko setup tym wiążące, na początku i tak dalej. Ale pojawia się błąd w powyższym kodzie:

04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor 

Jak naprawić ten problem? Gdzie będę musiał podać parametr? Następujące prace kodu, ale to raczej wykorzystuje klasę usług jako klasa, zamiast służby:

mShimmerService = new ShimmerService(this, mHandler); 

Odpowiedz

11

Nie należy skonstruować usługi (czynności lub odbiorników radiowych) wyraźnie. System Android robi to wewnętrznie. Właściwym sposobem na skonstruowanie usługi jest intencja z użyciem startService(); możesz dodać dodatkowe parametry do tego zamiaru.

+0

ale, w jaki sposób mogę przekazać handler używając i intent? jakieś przykłady? – Milan

+1

Do czego potrzebny jest ten program obsługi? Czy na pewno skonstruowanie handler'a od zera w serwisie nie pomoże? Usługi nie są wątkami; usługa jest wykonywana w tym samym wątku UI, co kod konsumenta. –

+0

Nie wiem, czy istnieje różnica między "bindService" i "startService" w tym zakresie, ale zgodnie z dokumentacją i [tą dyskusją] (https://groups.google.com/d/topic/android-developers/onqqpHz2WQw/discussion) dodatki nie mogą tam być, gdy intencja zostanie odebrana w 'onBind'. – DuneCat

1

Usługa rozszerza kontekst, więc nie jest potrzebny jako parametr w konstruktorze, ponieważ można użyć tej samej instancji.

Jeśli masz jakieś inne parametry, które chciałbyś przekazać do usługi, poleciłbym dodanie ich do intencji startService jako dodatki i umieszczenie ich w metodzie service.onStartCommand.

+0

ponownie, jak to jest możliwe przekazanie programu obsługi za pomocą intencji? – Milan

0

Nie przekazuj Handlerowi do usługi, Handler nie implementuje Parcelable ani Serializable, więc nie sądzę, że to możliwe.

Utwórz Handler w Serwisie i podaj wszelkie dane potrzebne do utworzenia Handler'a poprzez Exent Intent do Serwisu.

0

Musisz mieć konstruktor bezargumentowy dla swojej klasy usług, w przeciwnym razie system nie będzie wiedział, jak ją utworzyć.

0

Zamiast przekazywać Handler (lub inny obiekt) do usługi (co nie jest możliwe przy okazji), tworzysz i rejestrujesz BroadcastReceiver w swojej klasie aktywności. Kiedy musisz wywołać funkcje Handler (lub inne funkcje w innym obiekcie), wyślij transmisję na zarejestrowany odbiornik (sendBroadcast). Możesz także dodać do tego dodatkowe dodatkowe parametry i możesz obsłużyć cały potrzebny kod bezpośrednio z działania według parametrów.

Być może w takim przypadku Twój przewodnik zostanie całkowicie usunięty (Zależy od tego, czego faktycznie potrzebujesz.). W przypadku odbiorników telewizyjnych nie wiem, jak wyobrazić sobie sytuację, kiedy trzeba przekazać jakiś obiekt do Usługi. Z drugiej strony robisz coś niedobrego i powinieneś przejrzeć projekt aplikacji.

Jeśli chcemy, aby coś zostało przekazane do Usługi, możemy uruchomić usługę tylko z dodatkowymi parametrami w zamierzeniu. Usługa obsługuje stan zgodnie z tymi parametrami w środku.

Pomysł polega na tym, że usługa może działać niezależnie od innych części aplikacji, np. Działań. Możemy kontrolować go za pomocą dodatkowych parametrów, gdy uruchamiamy usługę lub wysyłamy transmisje w celu wywołania kodu zewnętrznego.

Powiązane problemy