2011-03-22 21 views
9

Mam problem z ponownym uruchomieniem usługi Androida. Buduję przeciwko API w wersji 7 i działa na urządzeniu z systemem Android 2.3.3.Brak połączenia z onStartCommand() następuje po ponownym uruchomieniu usługi zawieszonej w systemie Android 2.3

Problem polega na tym, że gdy moja usługa zostanie zabita przez system i później uruchomiona ponownie, tylko usługa onCreate() zostanie wywołana. kod w onStartCommand() nie jest wykonywany. Jeśli uruchamiam aplikację po raz pierwszy, kod w onStartCommand() jest normalnie wykonywany i wszystko działa poprawnie, dopóki system nie zabije mojej usługi, wtedy usługa nie uruchomi się poprawnie.

W przypadku ponownego uruchomienia usługi należy wywołać onStartCommand() z zerowym zamiarem. To nie jest moja sprawa.

Każdy pomysł, dlaczego tak się stanie?

Odpowiedz

11

Być może widzisz błąd w Gingerbread. W grupie android-programistów był wątek: onStartCommand bug thread

Zobacz wpis o numerze 26 autorstwa Dianne Hackborn w celu uzyskania szczegółowych informacji.

+1

dziękuję. więc muszę zduplikować kod inicjujący w onCreate i onCommandStart, ponieważ jest to widget ... – shelll

+0

Czy to możliwe, że nadal jest to błąd w wersji 4.2.2? – powder366

+0

Powinien zostać naprawiony w wersji 4.2.2 zgodnie z narzędziem do śledzenia problemów (https://code.google.com/p/android/issues/detail?id=12117&can=1&q=onstartcommand&colspec=ID%20Type%20Status%20Owner%20Summary % 20Stars) –

2

Jest to błąd w systemie Android 2.3 (poziom API 9), który został ustalony na poziomie API 10.

Od Dianne Hackborns post regarding this issue:

Dobra, to rzeczywiście przełamać w 3.3. [sic!] Zmiana nastąpiła w sierpniu z w zeszłym roku. Jest to zmiana, która go złamał:
https://android.googlesource.com/platform/frameworks/base/+/5474b0f8603ee66413c3e44600ca46f162f3089e

Zauważ, że odnośnik git commit wcześniej nie działał. Click here for a working mirror link to the commit and line that is causing the bug.

Również miała na myśli 2.3, ale napisała 3.3. She later corrected it and provided a suggestion for a workaround:

Przepraszam, tak, miałem na myśli 2.3.

Ten kod został znaleziony w bazie kodu, ponieważ został zwolniony kod GB, więc będzie kto wie, jakie urządzenia z nim wysyłają.

Problemem jest nie że usługi nie są wznowiona, prostu ich onStartCommand() nie jest wywoływana z zerową w tym czasie. Metoda onCreate() jest nadal wywoływana. Jako obejście, mógłbyś prawdopodobnie po prostu napisać wiadomość w onCreate() i ustawić flagę w onStartCommand(); jeśli nie otrzymałeś onStartCommand() przez czas przetwarzanie wiadomości, prawdopodobnie nie dostaniesz nent połączenie intent. (Jeśli trzeba to zrobić w ogóle ... ogólnie rzeczy jak rejestracji odbiorników, naprawdę naprawdę chcesz robić to w onCreate(), ponieważ ta metoda jest wywoływana tylko raz.)

Ona also wrote że to zachowanie zostanie naprawione w następnej aktualizacji platformy (po 3.0):

Zostanie to naprawione w kolejnej aktualizacji platformy (post-Android 3.0); Niestety, ten kod był przez jakiś czas niedostępny w drzewie źródłowym, oraz w kilku wydaniach teraz, więc będziemy musieli żyć z uszkodzonymi zachowaniami w tych wersjach. Usługa nadal będzie miała połączenie onCreate() , dzięki czemu będziesz mógł wykonywać tam pracę.

Zakładam poziom API ona wystawiona była 10, i mogę potwierdzić, że onStartCommand() nazywa null zamiarów po ponownym uruchomieniu usługi po przełączeniu z poziomu API 9 do 10.

+0

Zauważyłem, że to było powtarzalne na poziomie API 10 (2.3.6). Jednak NIE było odtwarzalne na poziomie API 14. – Pawan

Powiązane problemy