Android Autostart-Anwendung beim Booten: Theorie und Praxis

Eine einfache Suche auf stackoverflow.com zeigt, dass das Thema des Empfangs der Nachricht ACTION_BOOT_COMPLETED bis heute relevant bleibt. Wie Sie sehen, haben viele Anfänger ein Problem: Sie erhalten in ihren Anwendungen nicht die Nachricht ACTION_BOOT_COMPLETED. In diesem Artikel werde ich versuchen, die Daten aus der offiziellen Dokumentation, die Erfahrungen vieler Entwickler von stackoverflow.com sowie meine Erfahrungen zusammenzufassen. Wie kann man diesen "heimtückischen Feind" namens "ACTION_BOOT_COMPLETED" besiegen?

1. Theorie


Anhand von Beispielen aus einer offiziellen Quelle (z. B. dies und das ) und den Empfehlungen auf stackoverflow.com können die folgenden Regeln unterschieden werden:

  1. Geben Sie im Manifest im Element "manifest" die Berechtigung an:


  2. Registrieren Sie im Manifest im Anwendungselement Ihren Empfänger, um die Nachricht ACTION_BOOT_COMPLETED zu erhalten:


    oder


    Verwenden Sie den korrekten vollständigen oder relativen Klassennamen Ihres Rundfunkempfängers. Geben Sie in der Beschreibung des Empfängers nicht ohne weiteres die Attribute "aktiviert", "exportiert" usw. an. Standardmäßig sind genügend Einstellungen und Attribute vorhanden.

  3. Code Ihres Rundfunkempfängers:

    public class BootCompletedReceiver extends BroadcastReceiver {
        public BootCompletedReceiver() {
        }
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
              // ваш код здесь
            }
        }
    }
    

    Wenn Ihr Empfänger nur für die Nachricht ACTION_BOOT_COMPLETED verwendet wird, ist keine Wenn-Prüfung erforderlich. Manchmal verwenden Entwickler jedoch denselben Empfänger für unterschiedliche Nachrichten. Filtern Sie in diesem Fall die Nachrichten, indem Sie sie in der onReceive-Methode überprüfen.

  4. Die Anwendung muss im internen Speicher installiert sein. Das Android-Betriebssystem ist so konzipiert, dass die Nachricht ACTION_BOOT_COMPLETED vor dem Mounten des externen Speichers an Anwendungen gesendet wird. Daher erhalten Anwendungen, die auf einem externen Speicher installiert sind , diese Nachricht niemals . Um das System anzuweisen, die Anwendung nicht im externen Speicher zu installieren, müssen Sie im Manifest NICHT die Werte "auto" oder "PreferExternal" für das Attribut "@android: installLocation" festlegen. Standardmäßig, d.h. Wenn dieses Attribut nicht angegeben wird, installiert das Betriebssystem Ihre Anwendung nur im internen Speicher. Laut offizieller Dokumentation ist es jedoch besser, den Wert "internalOnly" explizit anzugeben, damit Sie und andere Entwickler nicht versucht sind, in Zukunft einen anderen Wert anzugeben.


  5. Nach der Installation oder dem erzwungenen Stopp (Force Stop) muss die Anwendung mindestens einmal gestartet werden, damit sich das System an diese Anwendung „erinnert“ und eine ACTION_BOOT_COMPLETED-Nachricht sendet. Dieses Verhalten wurde in Android 3.1 implementiert .aus Sicherheitsgründen. Was ist der Punkt? Alle neu installierten Anwendungen befinden sich im Status "Gestoppt" (nicht zu verwechseln mit Aktivität, da das Betriebssystem diesen Status für Anwendungen und Aktivierung auf unterschiedliche Weise steuert). Die Anwendung "verlässt" diesen Status, wenn der Benutzer ihn in den Telefoneinstellungen zwangsweise stoppt. Während sich die Anwendung in diesem Zustand befindet, wird sie aus keinem Grund vom System gestartet (z. B. über ACTION_BOOT_COMPLETED), außer natürlich den Start durch den Benutzer selbst. Dank dieser Innovation funktionierte ein beträchtlicher Teil der „Viren und Trojaner“ nicht mehr, weil Es ist nicht mehr möglich, nach der Installation automatisch zu starten.

    Bild

    Ausnahmen sind Systemanwendungen: s. Hinweis Benutzer kolipass .

  6. Funktionen des Schnellstartmodus auf HTC-Geräten. Es ist bekannt, dass HTC-Geräte nicht im klassischen Sinne neu starten, sondern das sogenannte verwenden. Schnellstartmodus (dies ist eine Form des Ruhezustands), bei dem der Status des Betriebssystems auf der Festplatte gespeichert wird. Daher wird die Nachricht ACTION_BOOT_COMPLETED vom System nicht als gesendet In der Realität findet kein Neustart statt ( siehe hier ). Anstelle von ACTION_BOOT_COMPLETED kann das System die folgenden Nachrichten senden:


    Geben Sie in Ihrer Anwendung zusätzlich zu ACTION_BOOT_COMPLETED die oben genannten Nachrichten im Tag "Empfänger" an. Zusätzlich muss zusätzlich zu Absatz 1 eine Genehmigung vorgeschrieben werden:



2. Übung: Fehler und Betriebsmerkmale


Wir werden die Fehler analysieren, die Anfänger beim Einrichten der Anwendung und im Code machen.

  1. Nach der Installation oder dem erzwungenen Stopp wurde die Anwendung nie gestartet (siehe S. 1.5).

  2. Die Anwendung wird nicht im internen Speicher installiert oder vom Benutzer manuell in den externen Speicher übertragen (siehe Abschnitt 1.4).

  3. Bei einigen Entwicklern begann der Empfang zu funktionieren, als sie den relativen Klassennamen des Empfängers angaben.

  4. Außerdem haben einige Entwickler beim Debuggen der Anwendung ihre Nachrichten vom Empfänger in logcat nicht gesehen. Verwenden Sie Toast zum Debuggen:

    Toast toast = Toast.makeText(context.getApplicationContext(),
            context.getResources().getString(R.string.your_message), Toast.LENGTH_LONG);
    toast.show()
    

  5. Tippfehler oder nicht vorhandene Nachrichten im Empfänger-Tag:


  6. Falsche Position von Elementen im Anwendungsmanifest:

    • "Verwendungsberechtigung" sollte nur als direkter Nachkomme des "Manifest" -Elements angegeben werden. Sie muss nicht im "Empfänger" -Tag angegeben / dupliziert werden.
    • Das Empfänger-Tag sollte nur als direkter Nachkomme des Anwendungselements angegeben werden.

  7. Verschiedene Task-Manager, Optimierer, Sicherheitsanwendungen, Start-up-Manager usw. kann die Registrierung der Anwendung für den Empfang von ACTION_BOOT_COMPLETED verfolgen und deren Empfang beim Booten verbieten / zulassen. Deinstallieren Sie diese Anwendungen oder fügen Sie Ihr Programm als Ausnahme in den Einstellungen hinzu.

    Bild

  8. Wie oben erwähnt, verwenden einige Geräte den Schnellstartmodus. Sie können versuchen, diesen Modus in den Telefoneinstellungen zu deaktivieren oder Abschnitt 1.6 zu berücksichtigen.

  9. Es gibt keine einzige Aktivität in der Anwendung, sodass der Benutzer nach der Installation nicht die Möglichkeit hat, Ihre Anwendung mindestens einmal auszuführen. Aus diesem Grund wird die Nachricht ACTION_BOOT_COMPLETED nicht an Ihre Anwendung gesendet.

  10. Keine Fehler, aber dennoch: Zusätzliche optionale Attribute werden im Empfänger-Tag angezeigt, z. B. Verwendungsberechtigung, aktiviert, exportiert):



3. Debuggen des Empfängers im Emulator und auf realen Geräten.


  1. Führen Sie im Terminal Folgendes aus:

    adb shell
    

    Geben Sie als Nächstes das Terminal ein, um ACTION_BOOT_COMPLETED an alle Anwendungen zu senden:

    am broadcast -a android.intent.action.BOOT_COMPLETED
    

    Um ACTION_BOOT_COMPLETED an eine bestimmte Anwendung zu senden, geben Sie das Terminal ein:

    am broadcast -a android.intent.action.BOOT_COMPLETED my.package.name
    

  2. Im Emulator: Installieren Sie Ihre Software, indem Sie sie im Studio ausführen. In diesem Fall sammelt das Studio Ihr Projekt, installiert die Anwendung und führt sie aus. Schließen Sie danach den Emulator (dies ähnelt dem Ausschalten eines realen Geräts). Um die Nachricht ACTION_BOOT_COMPLETED zu erhalten, starten Sie den Emulator über den AVD-Manager und verwenden Sie nicht die Schaltfläche App ausführen in der Studio-Symbolleiste.

    Bild: So starten Sie den Emulator über AVD
    Bild

    Geben Sie nach dem Starten des Emulators auf der Registerkarte Android Monitor den ausgeführten Emulator und Ihre Anwendung an, um Logcat-Protokolle anzuzeigen.

    Bild: Anzeigen von Logcat-Protokollen
    Bild


Zusammenfassung


Damit Ihre Anwendung beim Booten auf allen Geräten gestartet werden kann, sollte das Manifest mindestens so aussehen:


Der Empfängercode sieht in der Regel folgendermaßen aus:

public class BootCompletedReceiver extends BroadcastReceiver {
  public BootCompletedReceiver() {
  }
  public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
      Toast toast = Toast.makeText(context.getApplicationContext(),
              context.getResources().getString(R.string.your_message), Toast.LENGTH_LONG);
      toast.show();
      Log.d("myapp", context.getResources().getString(R.string.your_message);
      // ваш код здесь
    }
  }
}

Ich hoffe, dieser Artikel wird Anfängern helfen, den "heimtückischen Feind" namens "ACTION_BOOT_COMPLETED" zu überwinden.

Jetzt auch beliebt: