2010-10-03 20 views
28

Ich versuche, meine Night Anwendung automatisch zu starten beim Laden der folgenden BroadcastReceiver im onPause umgesetzt() -Methode:startActivity() von BroadcastReceiver

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

Der OnReceive() -Methode ausgelöst wird, wenn die USB-Kabel eingesteckt, aber die Aktivität startet nicht. Doch das Protokoll dies zeigt:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

Irgendwelche Ideen, warum das Protokoll sagt die Aktivität gestartet wird, aber es passiert nichts?

+0

Bitte aktualisieren Sie Ihr Problem mit mehr von LogCat - ein paar Zeilen vor diesem und ein Dutzend Zeilen nach diesem. Auch warum 'FLAG_ACTIVITY_NEW_TASK'? Ist die Aktivität, die diesen 'BroadcastReceiver' registriert hat, auch noch aktiv, wenn ACTION_POWER_CONNECTED auftritt? – CommonsWare

+0

Es gibt keine weiteren Zeilen in LogCat, wenn eine Verbindung zur Stromversorgung hergestellt wird. Der 'BroadcastReceiver' ist in derselben Aktivität registriert, die er starten soll. Diese Aktivität läuft immer noch im Hintergrund (die LogCat App wurde in den Vordergrund gebracht). Wenn diese Aktivität im Taskmanager beendet wird, scheint der BroadcastReceiver überhaupt nicht zu triggern. Ist dieser Ansatz, meine App von Anfang an falsch zu starten? – Gubbel

Antwort

16

Wenn Ihr Ziel ist, dass Sie möchten NightClock gestartet werden, wenn eine ACTION_POWER_CONNECTED Sendung gesendet wird, ist Ihr Ansatz der Verwendung eines BroadcastReceiver in Ordnung. Registrieren Sie es jedoch nicht bei einer Aktivität. Vielmehr registrieren es in dem Manifest:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

Dann haben Ihre BroadcastReceiver als öffentliche Java-Klasse (hier OnPowerReceiver genannt, obwohl man es so nennen kann, was Sie wollen), und es haben startActivity() nennen.

Bedenken Sie, dass die Benutzer wahrscheinlich nicht wollen, dass Sie das tun. Es gibt viele andere Fälle für den Anschluss eines Telefons an die Stromversorgung neben dem Starten einer "Nachtuhr". Ich schlage demütig vor, dass Sie Ihre Aktivitäten einfach über den Startbildschirm starten lassen.

+0

Ich habe den 'BroadcastReceiver' im Manifest registriert, wie Sie es bei diesem Aufruf in der 'onReceive()' Methode gesagt haben: 'context.startActivity (new Intent (context, NightClock.class));' Aber nichts passiert, wenn ich mich verbinde das Telefon an die Macht. Nicht einmal ein Log-Eintrag wird hinzugefügt, wenn ich 'Log.d (this.toString()," versuche App zu starten ... ");' zur Methode hinzufüge. – Gubbel

+2

@Gubbel: Hoppla. Versuchen Sie ''. Die meiste Zeit haben sie nicht die "ACTION_" in der Zeichenfolge, aber anscheinend tun sie dies. – CommonsWare

+0

Es funktioniert! Vielen Dank. – Gubbel

46

Sie haben Kontext als Parameter onRecieve() -Methode übergeben, so dass nur verwenden:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

Es funktioniert, natürlich müssen Sie Paket und Aktivitätsklasse Namen zu Ihren Selbst ändern.

+2

Warum der Downvote? Ist das schlecht? Es half mir so +1, da ich nichts finden konnte, das es eine schlechte Annäherung ist. – Mafro34

+0

@ Mafro34 Ich habe gerade den gleichen Ansatz versucht und der Grund, warum ich denke, dass es nicht ideal ist, ist die Flagge, die er setzt. Denn wenn Sie das nicht möchten (eine neue Aufgabe ausführen), könnte das Ihre Anwendungslogik ernsthaft in die Irre führen - jedenfalls mit meiner. Wenn Sie das nicht möchten, empfehle ich Ihnen, einen anderen Ansatz zu finden. – AgentKnopf

+5

@AgentKnopf Sieht so aus als hättest du nicht viel Auswahl: (von http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle % 29): "Wenn diese Methode außerhalb eines Aktivitätskontexts aufgerufen wird, muss die Absicht das Flag FLAG_ACTIVITY_NEW_TASK zum Starten enthalten. Dies ist darauf zurückzuführen, dass, ohne von einer vorhandenen Aktivität gestartet zu werden, keine Aufgabe vorhanden ist um die neue Aktivität zu platzieren und muss daher in eine eigene separate Aufgabe gestellt werden. " – aberaud

-3

Von Docs:

keine Aktivitäten von Rundfunkempfängern starten, weil die User Experience schrill ist; vor allem, wenn es mehr als einen Empfänger gibt. Betrachten Sie stattdessen eine Benachrichtigung.

+0

Sie überschreiben dies in vielen Standard-Apps wie Alarmen und eingehenden Anrufen. Also, wenn der Benutzer dies wünscht, ist es sein Anruf. Und deine Antwort beantwortet die Frage nicht. – Dpedrinha

Verwandte Themen