2016-10-20 4 views
1

I mit 4 Intent-FilterAndroid BroadcaseReceiver Leistung (zu langsam und ungenau)

  • Intent.ACTION_SCREEN_OFF
  • Intent.ACTION_SCREEN_ON
  • Intent.ACTION_USER_PRESENT
  • gemacht broadcasereceiver
  • Intent.ACTION_BOOT_COMPLETED

Es funktioniert !!! Jedes Mal, wenn ich Broadcast-Nachricht mit 4-Anweisung empfangen, kann ich Log-Nachricht finden, die funktioniert !!!

 @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO: This method is called when the BroadcastReceiver is receiving 
     // an Intent broadcast. 

     switch (intent.getAction()) { 
      case Intent.ACTION_SCREEN_ON: 
       Log.d("mypackage", "ACTION_SCREEN_ON"); 
       break; 
      case Intent.ACTION_SCREEN_OFF: 
       Log.d("mypackage", "ACTION_SCREEN_OFF"); 
       break; 
      case Intent.ACTION_BOOT_COMPLETED: 
       Log.d("mypackage", "ACTION_BOOT_COMPLETED"); 
       break; 
      case Intent.ACTION_USER_PRESENT: 
       Log.d("mypackage", "ACTION_USER_PRESENT"); 
       break; 
     } 

    } 

Aber Problem ist ... es funktioniert, aber nicht gut ... manchmal, nach Benutzeraktionen, gibt es einige Sekunden Verzögerung Mitteilung zu lesen .. und manchmal Protokollmeldung erscheint nicht einmal .. .

ist es mit meiner Code-Implementierung verbunden? oder nur Android schlechte Leistung ?? plz mir helfen ~

Antwort

0

Hauptsächlich ist es das System. Habe verschiedene Empfangszeiten für dieselbe Absicht auf verschiedenen Geräten gesehen. Es ist nervig, aber es gibt nicht viel, was man dagegen tun kann.

„Auch im Fall von normalen Sendungen, können das System in einigen Situationen zurückkehren zu einer Zeit, die Sendung einen Empfänger zu liefern. Insbesondere für Empfänger, die die Schaffung eines Prozess erfordern, nur Es wird jeweils eine ausgeführt, um zu vermeiden, dass das System mit neuen Prozessen überlastet wird. In diesem Fall gilt jedoch die nicht geordnete Semantik : Diese Empfänger können immer noch keine Ergebnisse zurückgeben oder ihre Übertragung abbrechen. "

https://developer.android.com/reference/android/content/BroadcastReceiver.html

+0

Dies bietet keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/14043456) – SiHa

+0

Die Antwort wurde aktualisiert. – Alex

0

Es hängt wirklich von dem Zustand der App während der Sendung Ausführung und die Android OS-Version, wo Ihre Anwendung ausgeführt wird.

Denken Sie daran, dass im UI-Thread eine BroadcastReceiver ausgeführt wird. Wenn Ihre Anwendung gleichzeitig eine schwere Aufgabe ausführt und Sie versuchen, das Ereignis im Empfänger zu verarbeiten, wird die Verarbeitung nur langsam vonstatten gehen. Sie werden sehen, wie das Ereignis erst dann bei Ihrem Empfänger eintrifft, wenn der UI-Thread-Looper inaktiv ist oder wie Ihre Benutzeroberfläche eingefroren ist, bis Ihr Empfänger das Ereignis verarbeitet.

Ich würde Ihnen empfehlen, zu überprüfen, wenn Sie gleichzeitig das Ereignis zu Ihrem Empfänger werfen Ihre Anwendung führt etwas im UI-Thread aus.

Um meine Anwendung in verschiedenen Geräten und Android OS-Versionen zu überwachen, verwende ich ein Tool, das ich http://flowup.io mit diesem Tool entwickeln ich kann die Bildrate, die ich in meiner App habe. Idealerweise sollten wir 60 fps haben, aber das ist nicht immer möglich :). Hier haben Sie ein Beispiel für meine Anwendungsleistung basierend auf verschiedenen Geräten und verschiedenen Android OS-Versionen:

enter image description here

Wie Sie sehen können, an einem gewissen Punkt die fps sind recht gering. Das liegt daran, dass ich einen Fehler in einem Service hatte, der eine Liste von 1000 Elementen im UI-Thread xD sortiert.

Ich würde Ihnen empfehlen, Ihre App zu überwachen und zu überprüfen, ob Ihr Problem direkt mit dem Empfänger oder dem Rest der App im UI-Thread zusammenhängt, wenn dieser außerhalb des UI-Threads liegen sollte. Da sich dieses Tool noch in der Entwicklung befindet, können Sie andere bereits veröffentlichte Tools verwenden: traeview, systrace oder den Android Studio-Leistungsmonitor. Sie können die Mail-Liste abonnieren, um zu wissen, wann die erste Veröffentlichung veröffentlicht werden soll, wenn Sie möchten.

Wenn Sie noch ein Ereignis senden müssen, können Sie andere Alternativen wie otto oder busevent verwenden, um die Broadcast-Nutzung zu ersetzen. Diese Bibliotheken können verwendet werden, wenn das von Ihnen gesendete Ereignis nicht vom Anwendungslebenszyklus abhängt.