Wie starte ich meine App beim Start?


241

Ich habe versucht, den Beispielcode in diesem Link zu verwenden, aber er scheint veraltet zu sein und hat nicht funktioniert. Welche Änderungen muss ich vornehmen und an welchen Dateien muss meine App automatisch gestartet werden, wenn Android den Startvorgang abgeschlossen hat?

Antworten:


315

Zunächst benötigen Sie die Erlaubnis in Ihrem AndroidManifest.xml:

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

Auch in Ihrem AndroidManifest.xmldefinieren Sie da und hören für die BOOT_COMPLETED Aktion:

<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>

Dann müssen Sie den Empfänger definieren, der die Aktion BOOT_COMPLETED erhält, und Ihren Dienst starten.

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);
        }
    }
}

Und jetzt sollte Ihr Dienst ausgeführt werden, wenn das Telefon gestartet wird.


8
Aktivitäten: developer.android.com/guide/topics/fundamentals/activities.html Dienste: developer.android.com/guide/topics/fundamentals/services.html Um Ihre Anwendung zu starten, wenn das Telefon tatsächlich gestartet wird, müssen Sie Registrieren Sie den Dienst wie oben gezeigt, und dort können Sie startActivity () verwenden, um Ihre App zu starten. Es ist jedoch keine gute Idee, einen Bildschirm vor den Benutzer zu stellen, wenn er nicht danach gefragt hat.
Sean Schulte

19
Ich wollte nur hinzufügen, dass es besser ist, Intent.ACTION_BOOT_COMPLETEDdie Zeichenfolge in Ihrem Receiver zu verwenden, anstatt sie fest zu codieren. Sollte auch den neuen Intent(context, MySystemService.class)Konstruktor beim Erstellen der Absicht verwenden.
Brianestey

7
Gibt es einen Grund für die Überprüfung des Absichtstyps, wenn der Absichtsfilter verwendet wird?
Pijusn

1
Aus irgendeinem Grund stehe ich Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filein der public classLeitung. Irgendwelche Ideen?
Pattyd

3
Was ist MySystemService?
Sport

120

So wird eine Aktivität nach dem Neustart des Android-Geräts gestartet:

Fügen Sie diesen Code in Ihre AndroidManifest.xmlDatei innerhalb des <application>Elements ein ( nicht innerhalb des <activity>Elements):

<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>

Erstellen Sie dann eine neue Klasse yourActivityRunOnStartup(die mit der android:namefür das <receiver>Element im Manifest angegebenen übereinstimmt ):

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);
        }
    }

}

Hinweis: Der Aufruf i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);ist wichtig, da die Aktivität aus einem Kontext außerhalb der Aktivität gestartet wird. Ohne dies wird die Aktivität nicht gestartet.

Auch die Werte android:enabled, android:exportedund android:permissionin dem <receiver>Tag nicht zwingend erscheinen. Die App empfängt das Ereignis ohne diese Werte. Siehe das Beispiel hier .


Ich mag diese "Abkürzung", um zu vermeiden, dass ich einen lokalen Dienst machen muss. Gehört dieser Code zu der Klasse, die erweitert wird Application? Vielleicht innerhalb onCreate()?
Jemand irgendwo

2
es sieht so aus, als ob dieser Absatz des Codes innerhalb onReceive()einesBroadcastReceiver
Jemand irgendwo

2
Dieser Code sollte sich in der Aktivität "yourActivityrRunOnStartup" befinden, die die BroadcastReceiver-Klasse und die Methode onReceive () erweitert.
Thrylos

2
Ich habe versucht, 10 Upvotes zu geben, konnte es aber nicht. Entschuldigung und Danke.
Sayka

1
Dies funktionierte für mich, aber NUR, wenn ich nur "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" im Absichtsfilter hatte. Wenn ich die anderen beiden benutzt habe, hat es nicht funktioniert.
Emhomm4

67

Hören Sie auf ACTION_BOOT_COMPLETE und tun Sie von dort aus, was Sie brauchen. Hier gibt es ein Code-Snippet .

Aktualisieren:

Der ursprüngliche Link bei der Antwort ist ausgefallen. Basierend auf den Kommentaren handelt es sich hier um verknüpften Code, da niemand den Code jemals verpassen würde, wenn die Links ausgefallen sind.

In AndroidManifest.xml (Anwendungsteil):

<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);  
        }

}

Quelle: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup


Welche Datei ist dieser Code platziert: öffentliche Klasse BootUpReceiver erweitert BroadcastReceiver
Jeff Janes

Es funktioniert, danke! (arbeitete an Android 4.0.4 API Level 15). Yup .. es ist 2017 und ich muss noch für Android 4.0.4 entwickeln .. :(
Luca

2
Funktioniert nicht unter Android 8.0! Funktioniert aber unter Android 4.0.
Codezombie

Ich benutze den gleichen Code, aber es funktioniert nicht bis zur Kitkat-Version. Ich möchte die Anwendung starten, wenn Android TV startet
Ashutosh Tripathi

@AshutoshTripathi hast du das behoben?
Ralphgabb

10

Darüber hinaus können Sie eine App wie AutoStart verwenden, wenn Sie den Code nicht ändern möchten, um beim Start eine Android-Anwendung zu starten: AutoStart - Kein Root


2

Die Lösung von Sean hat anfangs bei mir nicht funktioniert (Android 4.2.2). Ich musste dem gleichen Android-Projekt eine Dummy-Aktivität hinzufügen und die Aktivität mindestens einmal manuell auf dem Gerät ausführen. Dann begann die Lösung von Sean zu funktionieren und der BroadcastReceiver wurde nach nachfolgenden Neustarts benachrichtigt.


0

Bildschirmfoto

Ich möchte einen Punkt in diese Frage aufnehmen, mit dem ich einige Tage lang konfrontiert war. Ich habe alle Antworten ausprobiert, aber diese haben bei mir nicht funktioniert. Wenn Sie Android Version 5.1 verwenden, ändern Sie bitte diese Einstellungen.

Wenn Sie Android Version 5.1 verwenden, müssen Sie die App-Einstellungen deaktivieren (Zum Starten einschränken).

Einstellungen> App> Ihre App> Auf Start beschränken (deaktivieren)


3
Ich glaube nicht, dass dies jemals Standard war. Ich habe noch nie von "Restrict to launch" gehört. Ich habe es noch nie auf einem anderen Samsung, Asus, Sony gesehen ... Es macht für mich keinen Sinn. Es heißt, dass nur die App starten darf? Was bedeutet das?
Der unglaubliche

0

Ein anderer Ansatz besteht darin, Verzögerungen während des Startvorgangs zu vermeiden, android.intent.action.USER_PRESENTanstatt sie android.intent.action.BOOT_COMPLETEDzu vermeiden. Dies ist jedoch nur möglich, truewenn der Benutzer den Sperrbildschirm aktiviert hat. Andernfalls wird diese Absicht niemals gesendet.

Referenzblog - Das Problem mit der ACTION_USER_PRESENT-Absicht von Android


Mit anderen Worten, es sollte nicht verwendet werden
siehe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.