Jak uruchomić aplikację podczas uruchamiania?


241

Próbowałem użyć przykładowego kodu w tym linku, ale wydaje się on nieaktualny i nie działał. Więc jakie zmiany muszę wprowadzić i do jakich plików, aby moja aplikacja uruchomiła się automatycznie po zakończeniu uruchamiania Androida?

Odpowiedzi:


315

Po pierwsze potrzebujesz pozwolenia w AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Również w swoim AndroidManifest.xmlzdefiniuj usługę i nasłuchuj akcji BOOT_COMPLETED :

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Następnie musisz zdefiniować odbiornik, który otrzyma akcję BOOT_COMPLETED i uruchomi usługę.

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

A teraz usługa powinna być uruchomiona, gdy telefon się uruchomi.


8
Działania: developer.android.com/guide/topics/fundamentals/activities.html Usługi: developer.android.com/guide/topics/fundamentals/services.html Aby uruchomić aplikację, gdy telefon faktycznie się uruchomi, musisz: zarejestruj usługę, jak pokazano powyżej, a następnie tam możesz użyć startActivity (), aby uruchomić aplikację. Jednak umieszczenie ekranu przed użytkownikiem nie jest dobrym pomysłem, jeśli nie poprosi o to.
— Sean Schulte

19
Chciałem tylko dodać, że lepiej byłoby użyć Intent.ACTION_BOOT_COMPLETEDzamiast zakodować ciąg w odbiorniku. Ponadto, należy użyć nowego Intent(context, MySystemService.class)konstruktora podczas tworzenia zamiaru.
— brianestey

7
Czy istnieje powód do sprawdzenia typu zamiaru, jeśli używany jest filtr zamiaru?
— Pijusn

1
Z jakiegoś powodu wchodzę Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filena public classlinię. Jakieś pomysły?
— pattyd

3
Co to jest MySystemService?
— sport

120

W ten sposób na podjęcie działalności zaczynają biec po restarcie urządzenia android:

Wstaw ten kod do AndroidManifest.xmlpliku, w <application>elemencie ( nie w <activity>elemencie):

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

Następnie utwórz nową klasę yourActivityRunOnStartup(pasującą do android:namepodanej dla <receiver>elementu w manifeście):

package yourpackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

Uwaga: Wywołanie i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);jest ważne, ponieważ działanie jest uruchamiane z kontekstu poza działaniem. Bez tego działanie nie rozpocznie się.

Ponadto, wartości android:enabled, android:exporteda android:permissionw <receiver>tagu nie wydają obowiązkowe. Aplikacja odbiera zdarzenie bez tych wartości. Zobacz przykład tutaj .


Podoba mi się ten „skrót”, aby uniknąć konieczności wykonywania usługi lokalnej. Czy ten kod należy do rozszerzonej klasy Application? Może w środku onCreate()?
— Ktoś gdzieś

2
wygląda na to, że ustęp kodu powinna mieścić onReceive()oBroadcastReceiver
— ktoś gdzieś

2
Ten kod powinien znajdować się w działaniu, a mianowicie „yourActivityrRunOnStartup”, który rozszerza klasę BroadcastReceiver i wewnątrz metody onReceive ().
— thrylos

2
Próbowałem dać 10 głosów pozytywnych, ale nie mogłem. Przepraszam i dziękuję
— Sayka

1
Działa to dla mnie, ale TYLKO, jeśli miałbym tylko „<action android: name =" android.intent.action.BOOT_COMPLETED ”/>” w filtrze zamiaru. Jeśli użyłem pozostałych dwóch, to nie zadziałałoby.
— emhomm4

67

Słuchaj ACTION_BOOT_COMPLETE i rób odtąd wszystko, czego potrzebujesz. Jest tutaj fragment kodu .

Aktualizacja:

Oryginalny link przy odpowiedzi jest wyłączony, więc w oparciu o komentarze, tutaj jest kod połączony, ponieważ nikt nigdy nie przeoczyłby kodu, gdy linki są wyłączone.

W AndroidManifest.xml (część aplikacji):

<receiver android:enabled="true" android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

...

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

Źródło: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup


Który plik zawiera ten kod: Klasa publiczna BootUpReceiver rozszerza BroadcastReceiver
— Jeff Janes

Działa, dzięki! (działał na Androidzie 4.0.4 API poziom 15). Tak, jest 2017, a ja wciąż muszę opracować dla Androida 4.0.4 .. :(
— Luca,

2
Nie działa na Androidzie 8.0! Działa jednak na Androidzie 4.0.
— codezombie

używam tego samego kodu, ale nie działa z wersją KitKat, chcę uruchomić aplikację po uruchomieniu telewizora z
— Androidem

@AshutoshTripathi miałeś to naprawić?
— ralphgabb

10

Dodatkowo możesz użyć aplikacji takiej jak AutoStart, jeśli nie chcesz modyfikować kodu, aby uruchomić aplikację na Androida podczas uruchamiania: AutoStart - Bez roota


2

Rozwiązanie Seana początkowo nie działało dla mnie (Android 4.2.2). Musiałem dodać fikcyjną aktywność do tego samego projektu na Androida i przynajmniej raz uruchomić ją ręcznie na urządzeniu. Następnie rozwiązanie Seana zaczęło działać, a BroadcastReceiver został powiadomiony o kolejnych uruchomieniach.


0

zrzut ekranu

Chciałbym dodać jeden punkt w tym pytaniu, z którym miałem do czynienia przez kilka dni. Próbowałem wszystkich odpowiedzi, ale te nie działały dla mnie. Jeśli używasz Androida w wersji 5.1, zmień te ustawienia.

Jeśli używasz Androida w wersji 5.1, musisz odznaczyć (Ogranicz, aby uruchomić) w ustawieniach aplikacji.

ustawienia> aplikacja> Twoja aplikacja> Ogranicz, aby uruchomić (usuń zaznaczenie)


3
Nie sądzę, żeby to było kiedykolwiek standardowe. Nigdy nie słyszałem o „Ogranicz do uruchomienia”. Nigdy nie widziałem go na innych urządzeniach Samsung, Asus, Sony ... Dla mnie to nie ma sensu. Mówi, że tylko aplikacja może się uruchomić? Co to znaczy?
— Niesamowity

0

Innym podejściem jest użycie android.intent.action.USER_PRESENTzamiast android.intent.action.BOOT_COMPLETEDunikania spowolnień podczas procesu uruchamiania. Ale dzieje się tak tylko truewtedy, gdy użytkownik włączył ekran blokady - w przeciwnym razie ten zamiar nigdy nie zostanie nadany.

Blog referencyjny - Problem z intencją ACTION_USER_PRESENT w Androidzie


Innymi słowy, nie należy go używać
— behelit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.