2016-04-18 18 views
0
nicht

Ich möchte einen Ton als Benachrichtigung wiedergeben, wenn der Akku voll ist.Empfängerklasse erkennt ACTION_BATTERY_CHANGED

in meiner Empfängerklasse Ich schrieb 2 weitere Benachrichtigungen für "Power verbunden" und "Power getrennt" und sie funktioniert ok!

aber mein Empfänger erkennt ACTION_BATTERY_CHANGED nicht. Ich habe viel gesucht und herausgefunden, dass ich es programmatisch registrieren muss.

Das Problem ist, dass ich es ohne jede Aktivität registrieren muss. Weil ich "Battery_Fully_charged" benachrichtigen möchte, selbst wenn mein Programm nicht läuft.

Wie kann ich so etwas in meinem Empfänger ("MyReceiver.class") registrieren?

Hier ist der Beispielcode, den ich gefunden habe und es funktioniert. Aber ich möchte es ohne eine Aktivität machen.

public class Main extends Activity { 
    private TextView batteryTxt; 
    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context ctxt, Intent intent) { 
     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
     batteryTxt.setText(String.valueOf(level) + "%"); 
    } 
    }; 

    @Override 
    public void onCreate(Bundle b) { 
    super.onCreate(b); 
    setContentView(R.layout.main); 
    batteryTxt = (TextView) this.findViewById(R.id.batteryTxt); 
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    } 
} 

Edit: was ist der Unterschied zwischen Dienst und Empfänger Broad? Ich habe versucht, den Dienst aber noch kein Ergebnis bekommen haben

+0

Verwenden Sie einen Dienst anstelle einer Aktivität. Hinweis: Android wird implizite Absichten wie diese los, so dass es möglicherweise nicht in Android N funktioniert. –

+0

@Eugen Pechanec Natürlich habe ich Service benutzt und trotzdem funktioniert es nicht. Kannst du ein Beispiel veröffentlichen? –

+0

So etwas gibt es natürlich nicht, wie soll ich das wissen? Was, wenn du das gepostet hast, was du versucht hast, also wiederholen wir uns nicht? –

Antwort

0

Von documentation:

Sie können dies durch in Manifesten erklärt Komponenten nicht erhalten, nur durch explizit mit Context.registerReceiver() für sie zu registrieren. [...]

Das bedeutet:

1) Nur ein BroadcastReceiver diese Absichten empfangen kann.

2) Nur ein dynamisch registrierter Empfänger kann diese Absichten empfangen.

Sie bereits wissen, wie es zu tun innerhalb einer Aktivität des im Dienst aussehen lassen:

public class MyService extends Service { 

    private final IntentFilter batteryIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    private final BroadcastReceiver batteryReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context ctxt, Intent intent) { 
      // React. 
     } 
    }; 

    public void onCreate() { 
     super.onCreate(); 
     registerReceiver(batteryReceiver, batteryIntentFilter); 
    } 

    public void onDestroy() { 
     unregisterReceiver(batteryReceiver); 
     super.onDestroy(); 
    } 

    public int onStartCommand (Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 
} 

Sie die Chance des Dienstes verringern kann, indem es in den Vordergrund jämmerlich (google „Vordergrund-Service“).

Wie in http://developer.android.com/preview/behavior-changes.html#bg-opt erwähnt, gehen einige implizite Absichten weg, also seien Sie vorbereitet ACTION_BATTERY_CHANGED wird unter ihnen sein.

+0

danke für Ihre Antwort. Ich habe diese Klasse verwendet, und ich habe die Tag in Manifest hinzugefügt Datei, aber ich bin immer noch nicht in der Lage, diese Aktion zu bekommen. Muss dieser Dienst nicht von irgendwo starten? Die "OnCreate" läuft automatisch? –

+0

Oh, ja, Sie müssen 'startService (neue Absicht (this, MyService. Klasse)); 'an einem bestimmten Punkt. Wenn Sie es brauchen, um die ganze Zeit zu laufen, können Sie die Anwendung" Unterklasse "ableiten. Siehe http://www.devahead.com/blog/2011/06/extension-the-android-application- Class-and-Dealing-with-Singleton /. –

+0

Vielen Dank.Es funktioniert jetzt. Nur noch eine Frage. Stoppt dieser Dienst unter bestimmten Bedingungen? Ich habe gerade den unregisterReceiver entfernt, um ACTION_BATTERY_CHANGED weiterhin zu erkennen. Abgesehen davon ist es in meiner App nicht wichtig, den Dienst zu bearbeiten. Funktioniert das so? [Ich habe die Anwendung verwendet, um es zu starten] –