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.