wake-up-neo.com

BroadcastReceiver empfängt BOOT_COMPLETED nicht

Ich habe mich hier nach ähnlichen Problemen umgesehen, aber aus irgendeinem Grund erhält mein BroadcastReceiver nie die Absicht Android.intent.action.BOOT_COMPLETED.

Hier ist meine (relative) Android.Manifest-Datei:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>    
<receiver Android:name=".BootReceiver"
        Android:enabled="true"
        Android:exported="true"
        Android:label="BootReceiver">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"></action>

        </intent-filter>
    </receiver>

Und hier ist der eigentliche Empfänger.

public class BootReceiver extends BroadcastReceiver {
private static final String TAG="BootReceiver";

@Override public void onReceive(Context context,Intent intent){
    try{
        context.startService(new Intent(context,ConnectivityListener.class));
        Log.i(TAG,"Starting Service ConnectivityListener");
    }catch(Exception e){
        Log.e(TAG,e.toString());
    }
}
}

Vielen Dank! Jede Hilfe wird sehr geschätzt

63
apmeyers1987

Es stellte sich heraus, dass der Empfänger nicht im Tag des Manifests enthalten war. Hoppla! Danke für eure Hilfe! Das Schlimmste beim Testen ist, dass Sie das Telefon immer wieder aus- und wieder einschalten müssen. : P

11
apmeyers1987

Sie können alle Broadcast-Aktionen emulieren, indem Sie über adb eine Verbindung zum Gerät herstellen und eine Geräte-Shell öffnen.

Auf geht's:

  • öffnen Sie die Konsole/das Terminal und navigieren Sie zu/platform-tools
  • art adb Shell oder unter Linux/Mac ./adb Shell
  • in der Shell geben Sie am broadcast -a Android.intent.action.BOOT_COMPLETED oder was auch immer Aktion Sie abfeuern möchten

Es gibt eine Reihe von Nice-Befehlen, die mit adb oder der adb-Shell geliefert werden. Probier es einfach

Grüße Flo

edit: oh verdammt, ich wollte diese antwort als antwort auf das "musste telefon jedes mal ein-/ausschalten". Tut mir leid, Leute

164
fklappan

Ich poste dies in der Hoffnung, dass es für jemanden hilfreich ist, der alles ausprobiert hat, es aber nach der Installation beim Booten noch nicht zum Laufen bringt oder früher funktionierte und nicht mehr funktioniert.

Vorausgesetzt, Sie haben die Berechtigung hinzugefügt:

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

Und registrierte Ihren Empfänger:

<receiver Android:name="com.example.startuptest.StartUpBootReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Und kodiert dein BroadcastReceiver:

public class StartUpBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
            ...
        }
    }
}

Beginnend mit Android 3.1 werden alle Anwendungen bei der Installation in ein " gestopptes "Zustand. (Dies ist derselbe Zustand, in dem die Anwendung endet, nachdem der Benutzer die App aus der Anwendung" Einstellungen "heraus erzwungen hat.)

Android stopped state

Im Status "Gestoppt" wird die Anwendung aus keinem Grund ausgeführt , außer durch manuellen Start einer Aktivität. (Bedeutet, dass kein BroadcastRecevier (ACTION_PACKAGE_INSTALLED, BOOT_COMPLETED Usw. aufgerufen wird, unabhängig von dem Ereignis, für das sie sich registriert haben, bis zum Benutzer führt die App manuell aus .)

Dies ist eine Designentscheidung von Google, um Malware-Apps zu verhindern. Google hat empfohlen, dass Nutzer zuerst eine Aktivität über den Launcher starten, bevor diese Anwendung viel bewirken kann. Es ist eine logische Konsequenz dieses Arguments, zu verhindern, dass BOOT_COMPLETED Übermittelt wird, bis die Aktivität gestartet wird.

Sobald ein Benutzer eine Aktivität in Ihrer App einmal ausführt, erhalten Sie nach allen zukünftigen Starts die Sendung BOOT_COMPLETED.

Weitere Details dazu:
http://developer.Android.com/about/versions/Android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/

140
Caner

Wenn Ihre App auf externem Speicher (SD-Karte) installiert ist, erhalten Sie niemals die Aktion Boot Complete. Sie müssen also Android:installLocation="internalOnly" in dem manifest tag.

55
Sundeep1501

Ihr <uses-permission> - Element muss ein unmittelbares untergeordnetes Element des <manifest> - Elements sein, und Ihre obige Codeauflistung weist darauf hin, dass dies nicht der Fall ist.

Hier ist ein Beispielprojekt Demonstration der Verwendung von BOOT_COMPLETED.

12
CommonsWare

Dies scheint der Hauptthema für dieses Problem zu sein, daher wollte ich meinen C # -Kollegen eine Lösung hinzufügen. Ich habe mir den Kopf zerbrochen, um herauszufinden, was ich falsch gemacht habe, nachdem ich hier alles versucht hatte, ohne Erfolg. Ich habe endlich herausgefunden, was falsch war, und es weicht ein wenig von den Ratschlägen für die C # Mono-Entwicklung ab. Im Grunde läuft es auf etwas hinaus, das ich gerade auf die harte Tour gelernt habe. Mit C # AndroidManifest.xml NICHT manuell ÄNDERN!

Siehe dieses Handbuch als Referenz: Xamarin: Arbeiten mit AndroidManifest.xml

Weitere Informationen zu diesem Problem finden Sie hier.

Zunächst befindet sich in Ihren Projekteigenschaften auf der Registerkarte Manifest eine Kontrollkästchenliste zur Auswahl der Berechtigungen, die Sie bereitstellen möchten. Eine davon ist RECEIVE_BOOT_COMPLETED. Überprüfen Sie dies, um diese Berechtigungen bereitzustellen.

Zweitens müssen Sie die richtigen Tags in Ihre BroacastReceiver-Klasse einfügen.

[BroadcastReceiver]
[IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class MyBootReceiver : BroadcastReceiver
{
   public override void OnReceive(Context context, Intent intent)
   {
      // Do your boot work here, set alarms, show toasts, whatever
   }
}

Der letzte Teil von [IntentFilter ()], der sich mit Priorität befasst, ist nicht erforderlich. Er lässt andere Dinge mit höherer Priorität erst beim Booten erledigen und ist eine gute Praxis, wenn Ihre App keine Sache mit hoher Priorität ist.

Wie Sie im verlinkten Artikel sehen werden, führt die Verwendung dieser Tags in Ihrem Code dazu, dass die AndroidManifest.xml-Datei zum Zeitpunkt der Erstellung erstellt wird, und zwar in der Art und Weise, wie sie sein sollte. Als ich das Manifest manuell so änderte, dass es das Empfänger-Tag enthielt, veranlasste das System, zu tief nach der Klasse 1 zu suchen, wodurch eine ClassNotFound-Ausnahme ausgelöst wurde. Es wurde versucht, [Namespace]. [Namespace]. [BroadcastReceiver] zu instanziieren, was falsch war. Und das geschah aufgrund der manuellen Manifest-Änderungen.

Wie auch immer, hoffe das hilft.

Auch ein weiterer kurzer Tipp mit dem AdB-Tool. Wenn Sie eine übersichtlichere Version des Protokolls erhalten möchten, versuchen Sie Folgendes:

C:\Android\Plattformtools\adb logcat >> C:\log.txt

Das logcat wird in eine Textdatei geschrieben, die Sie etwas einfacher öffnen und lesen können als im Eingabeaufforderungsfenster. Erleichtert auch das Ausschneiden und Einfügen von Dingen.

5
Wanabrutbeer

Bezüglich einiger Geräte, auf denen Android KitKat 4.4.4_r2/r1.

Es scheint einen Fehler in Android) zu geben, der dazu führt, dass Android.intent.action.BOOT_COMPLETED nicht gesendet wird.

Sehen:
BOOT-FEHLER beim Bereitstellen des Package Manager-Dienstes

In den meisten Fällen ist dies nicht die Antwort auf Ihre Probleme (eher aufgrund von Berechtigungen usw.). Wenn Sie jedoch KitKat ausführen, sollten Sie einen Blick darauf werfen, ob dies bei Ihnen der Fall zu sein scheint.

Ich hatte dieses Problem und Android.intent.action.BOOT_COMPLETED wurde manchmal einfach nicht gesendet, wenn es gestartet war!

1
JohnyTex

beim Hinzufügen von <category Android:name="Android.intent.category.HOME" /> dies zu meiner Manifestdatei löst mein Problem und funktioniert.

<receiver Android:name=".BroadCastRecieverClass">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <category Android:name="Android.intent.category.HOME" />
        </intent-filter>
    </receiver>
0
Ayaz khan

In den anderen Antworten wurde bereits erläutert, wie der Broadcast Receiver perfekt implementiert werden kann, damit er funktioniert. Ich hatte jedoch immer noch Probleme, die Absicht BOOT_COMPLETED zu empfangen, bis mir klar wurde, dass die App tatsächlich funktioniert, als ich vom Telefon/Emulator aus auf das App-Symbol drückte. Immer wenn ich meine App mit den Befehlen debug/run von Android Studio aus starte, wird der BOOT_COMPLETED Intent nicht ausgeliefert, es sei denn, die App ist geöffnet und läuft.

Ich hoffe, das kann jemandem helfen, der wie ich stundenlang mit diesem Problem zu kämpfen hatte. Wenn jemand eine Erklärung für dieses Verhalten hat, würde ich mich sehr freuen, mehr darüber zu erfahren.

0
c0rtexx