Próbowałem uruchomić usługę, gdy urządzenie uruchamia się na Androidzie, ale nie mogę go uruchomić. Przejrzałem kilka linków online, ale żaden kod nie działa. Czy coś zapomniałem?
AndroidManifest.xml
<receiver
android:name=".StartServiceAtBootReceiver"
android:enabled="true"
android:exported="false"
android:label="StartServiceAtBootReceiver" >
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.test.RunService"
android:enabled="true" />
Odbiornik transmisji
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent serviceLauncher = new Intent(context, RunService.class);
context.startService(serviceLauncher);
Log.v("TEST", "Service loaded at start");
}
}
Odpowiedzi:
Pozostałe odpowiedzi wyglądają dobrze, ale pomyślałem, że zawinę wszystko w jedną pełną odpowiedź.
W twoim
AndroidManifest.xml
pliku potrzebujesz :W twoim
<manifest>
elemencie:W swoim
<application>
elemencie (pamiętaj o użyciu w pełni kwalifikowanej [lub względnej] nazwy klasyBroadcastReceiver
):(nie potrzebne
android:enabled
,exported
itd atrybuty: Android domyślne są poprawne)W
MyBroadcastReceiver.java
:Z pierwotnego pytania:
<receiver>
element był w<application>
elemencieBroadcastReceiver
podano<intent-filter>
źródło
Jako dodatkowe informacje: BOOT_COMPLETE jest wysyłany do aplikacji przed zamontowaniem pamięci zewnętrznej. Jeśli więc aplikacja zostanie zainstalowana w pamięci zewnętrznej, nie otrzyma komunikatu emisji BOOT_COMPLETE.
Więcej szczegółów tutaj w sekcji Odbiorniki emisji nasłuchują na „rozruch zakończony”
źródło
Jak uruchomić usługę po uruchomieniu urządzenia (aplikacja autorun itp.)
Po pierwsze: od wersji Androida 3.1+ nie otrzymasz BOOT_COMPLETE, jeśli użytkownik nigdy nie uruchomił Twojej aplikacji przynajmniej raz lub użytkownik „wymusi zamknięcie” aplikacji. Zrobiono to, aby zapobiec automatycznemu rejestrowaniu usługi przez złośliwe oprogramowanie. Luka w zabezpieczeniach została zamknięta w nowszych wersjach Androida.
Rozwiązanie:
Utwórz aplikację z aktywnością. Gdy użytkownik uruchomi go raz, aplikacja może odebrać komunikat emisji BOOT_COMPLETE.
Po drugie: BOOT_COMPLETE jest wysyłane przed podłączeniem pamięci zewnętrznej. Jeśli aplikacja jest zainstalowana w pamięci zewnętrznej, nie otrzyma komunikatu emisji BOOT_COMPLETE.
W tym przypadku istnieją dwa rozwiązania:
Jeśli Twoja aplikacja jest już zainstalowana w pamięci wewnętrznej, poniższy kod może pomóc zrozumieć, jak uruchomić usługę po uruchomieniu urządzenia.
W pliku Manifest.xml
Pozwolenie:
Zarejestruj swój odbiornik BOOT_COMPLETED:
Zarejestruj swoją usługę:
W odbiorniku OnBoot.java:
W przypadku HTC może być konieczne dodanie Manifestuj ten kod, jeśli urządzenie nie wyłapuje RECEIVE_BOOT_COMPLETED:
Odbiornik wygląda teraz tak:
Jak przetestować BOOT_COMPLETED bez restartu emulatora lub rzeczywistego urządzenia? To jest łatwe. Spróbuj tego:
Jak uzyskać identyfikator urządzenia? Uzyskaj listę podłączonych urządzeń o identyfikatorach:
adb w ADT domyślnie można znaleźć w:
Cieszyć się! )
źródło
Wraz z
Użyj również,
Wygląda na to, że urządzenia HTC nie łapią BOOT_COMPLETED
źródło
android.intent.action.QUICKBOOT_POWERON
jest wysyłany tylko podczas przywracania z szybkiego rozruchu. Oznacza to, że nie trzeba wykonywać resetowania alarmów podczas odzyskiwania po szybkim rozruchu, ponieważ są one zachowane. Dlatego konieczne byłoby użycie,<action android:name="android.intent.action.QUICKBOOT_POWERON" />
jeśli chcesz coś zrobić, gdy użytkownik myśli, że urządzenie zostało uruchomione.zwróć uwagę, że na początku pytania występuje literówka:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
zamiast :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
jedno małe „_” i wszystkie te kłopoty :)
źródło
Właśnie się dowiedziałem, że może to wynikać z
Fast Boot
opcji wSettings
>Power
Po wyłączeniu tej opcji moja aplikacja odbiera tę transmisję, ale nie inaczej.
Nawiasem mówiąc, mam
Android 2.3.3
na sobieHTC Incredible S
.Mam nadzieję, że to pomoże.
źródło
Myślę, że twój manifest musi dodać:
źródło
Po wypróbowaniu wszystkich wymienionych odpowiedzi i sztuczek w końcu odkrywam, dlaczego kod nie działa w moim telefonie. Niektóre telefony z Androidem, takie jak „Huawei Honor 3C Android 4.2.2 ”, mają menu Menedżera Statup w swoich ustawieniach, a twoja aplikacja musi być zaznaczona na liście. :)
źródło
Mam dodatkowy
<category>
znacznik, nie wiem, czy to coś zmienia.Czy próbowałeś ominąć klauzulę „if”
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, ponieważ odbiorca prawdopodobnie i tak odbiera tę intencję?źródło
Zapoznaj się z tym linkiem http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Procedura krok po kroku, aby użyć rozruchu w usłudze
źródło
Przed zainstalowaniem pamięci zewnętrznej BOOT_COMPLETE jest wysyłane jako wykonanie. Jeśli aplikacja jest zainstalowana w pamięci zewnętrznej, nie otrzyma komunikatu emisji BOOT_COMPLETE. Aby temu zapobiec, możesz zainstalować aplikację w pamięci wewnętrznej. możesz to zrobić po prostu dodając ten wiersz w menifest.xml
Niektóre urządzenia HTC mogą włączyć funkcję „szybkiego rozruchu”, która bardziej przypomina głęboką hibernację i nie jest prawdziwym ponownym uruchomieniem, a zatem nie powinna dawać intencji BOOT_COMPLETE. Aby to odzyskać, możesz dodać ten filtr intencji do odbiornika:
źródło
Oto co zrobiłem
1. Zrobiłem klasę Odbiornika
2. w manifeście
3. i po WSZYSTKIM, CO POTRZEBUJESZ „ustawić” odbiornik w MainActivity, może on znajdować się w
ostatnia kupa, której nauczyłem się od ApiDemos
źródło
Jeśli korzystasz z Android Studio i bardzo lubisz autouzupełnianie, muszę Cię poinformować, że korzystam z Android Studio w wersji 1.1.0 i użyłem autouzupełniania dla następujących uprawnień
Android Studio automatycznie ukończył
RECEIVE_BOOT_COMPLETED
wszystko małymi literami,receive_boot_completed
a ja wciąż wyciągałem włosy, ponieważ już zaznaczyłem moją listę kontrolną, aby dowiedzieć się, co zrobić, aby rozpocząć obsługę przy rozruchu. Właśnie potwierdziłem ponownieźródło
Jak skomentował @Damian, wszystkie odpowiedzi w tym wątku robią to źle. Wykonanie tego ręcznie w ten sposób grozi zatrzymaniem Usługi na środku z powodu uśpienia urządzenia. Najpierw musisz uzyskać blokadę aktywacji. Na szczęście biblioteka Wsparcia daje nam klasę, aby to zrobić:
następnie w swojej usłudze pamiętaj o zwolnieniu blokady aktywacji:
Nie zapomnij dodać uprawnienia WAKE_LOCK do swojego Mainfest:
źródło
onNewIntent()
? Lub możesz spojrzeć na źródło IntentService i zobaczyć, co musisz zrobić, aby Twoja usługa się dopasowała ...W rzeczywistości ostatnio wpadłem w ten problem i naprawdę bardzo łatwo go naprawić, właściwie nie robisz nic złego, jeśli skonfigurujesz
"android.intent.action.BOOT_COMPLETED"
zezwolenie i filtr celowy.Pamiętaj, że jeśli korzystasz z systemu Android 4.X, musisz uruchomić nasłuchiwanie rozgłoszeniowe przed uruchomieniem usługi przy rozruchu, co oznacza, że musisz najpierw dodać aktywność, po uruchomieniu odbiornika rozgłoszeniowego aplikacja powinna działać zgodnie z oczekiwaniami, jednak na Androidzie 4.X nie znalazłem sposobu na uruchomienie usługi przy rozruchu bez żadnej aktywności, myślę, że Google zrobiło to ze względów bezpieczeństwa.
źródło
Napotkałem ten problem, jeśli zostawię pusty konstruktor w klasie odbiornika. Po usunięciu pustego contsructor onOdbiorczy metos zaczął działać dobrze.
źródło