1

Ich habe eine IntentService, die eine lange Arbeit macht, es dauert etwa 15 Minuten. Es ist ein Synchronisierungsprozess, um neue Daten von meinem Server zu erhalten.Warum mein BroadcastReceiver nach einer Weile nicht mehr empfängt

Wenn dieser Dienst startet, starte ich auch eine Aktivität, um den Fortschritt anzuzeigen.

Mit dieser Aktivität wird eine BroadcastReceiver erstellt, die vom Dienst über den Prozessfortschritt gesendete Nachrichten abfängt.

Wenn ich die App die Arbeit mache, nach einer Weile die SO den Bildschirm ausschalten.

Wenn ich den Bildschirm nach etwa 15 Minuten erneut einschalte, wurde der Dienst bereits ausgeführt, aber der Fortschritt scheint veraltet zu sein. Die BroadcastReceiver hat aufgehört zu arbeiten, und meine END OF SYNCHRONIZATION Nachricht wurde von der Aktivität nicht empfangen.

Das Problem ist, dass ich bei dieser Nachricht die Hauptaktivität erneut starte, damit der Benutzer die App erneut verwenden kann.

Wie kann ich das lösen?

+1

Beitrag einig Code ... Ich würde vermuten, Ihre Aktivität wird nicht mit Nachrichten, weil Ihr Empfänger nicht registriert onPause oder onDestroy ist, aber es ist schwer zu erzählen, da es keinen Code gibt. Ich würde vorschlagen, serviceBinding und Messenger anstelle von Broadcast-Empfängern zu hören und eine Staut-Nachricht senden, wenn Ihre Aktivität bindet, um den neuesten Stand zu erhalten ... aber wieder würde Code helfen. –

+0

@AdamW Die Übertragung ist in den Methoden onStart und onStop registriert und nicht registriert. –

Antwort

0

Ich löste mit diesem http://developer.android.com/intl/pt-br/guide/components/services.html#Foreground.

Mein Service

public class MyService extends Service { 

    public interface MyCallback { 
     void onProgress(int progress); 
    } 

    public class MyBinder { 
     public MyService getService() { 
      return MyService.this; 
     } 
    } 

    public IBinder onBind(Intent intent) { 
     return new MyBinder(); 
    } 

    public void make(MyCallback callback) { 

     Notification n = new Notification.Builder(this) 
      .setContentTitle("Processing") 
      .getNotification(); 

     startForeground(666 /*some ID*/, n); 
     try { 
      callback.onProgress(0); 
      // do the hard sutff and report progress 
      callback.onProgress(100); // report 100% 
     } finally { 
      stopForeground(true); 
     } 
    } 
} 

Meine Tätigkeit

public MyActivity extends Activity implements ServiceConnection, MyService.MyCallback { 

    @Override 
    protected onStart() { 
     super.onStart(); 
     // 1 - bind service to this activity 
     Intent i = new Intent(this, MyService.class); 
     this.bindService(i, this, BIND_AUTO_CREATE); 
    } 

    @Override 
    public void onServiceConnected(ComponentName componentName, final IBinder iBinder) { 
     // 2 - when the service was binded, starts the process asynchronous 
     new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(Void... voids) { 
       ((MyService.MyBinder) iBinder).getService().make(MyActivity.this); 
       return null; 
      } 
     }.execute(); 
    } 

    @Override 
    public void onProgress(int progress) { 
     // 3 - when to callback is fired, update the UI progress bar 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // call ProgressBar.setProgress(progress); 
      } 
     }); 
    } 

} 
0

Broadcast-Empfänger sind nicht für lange Arbeiten geeignet.

Die Lebensdauer eines Rundfunkempfängers beträgt etwa 10-15 Sekunden.

Eine empfohlene oder typische Verwendung eines Empfängers Sendung zu

  • Start a Service
  • zeigen einen Toast
  • starten eine Aktivität

In Ihrem Fall sollten Sie einen Dienst starten von Ihrem Sendeempfänger und erledigen Sie alle Arbeiten in diesem Dienst.

Verwandte Themen