2017-11-28 3 views
1

Ich habe eine Klasse, die erweitert IntentService; In dieser Klasse sende ich eine Intent, die von einer BroadcastReceiver innerhalb einer Activity registriert werden sollte. Das Problem ist, dass 90% der BroadcastReceiverIntent korrekt empfängt. 10% tut es nicht. Debugging meiner App Ich sah, dass alle meine Code funktioniert perfekt, bis die Intent gesendet wird; Das Problem trat auf, nachdem die Intent gesendet wurde!BroadcastReceiver empfängt nicht immer

Dies ist mein Code. Manifest-Datei:

... 
<receiver 
    android:name=".BroadcastReceiver.MediaBroadcastReceiver" 
    android:enabled="true" 
    android:exported="true" /> 
... 

BroadcastReceiver in der Aktivität:

public class ContactDetail extends AppCompatActivity implements MediaBroadcastReceiverInterface{ 
... 
    @Override 
    public void MediaBroadcastReceiverCallback() { 
     //This is the method that is not always called 
    } 
... 
} 

ist dies die BrodcastReceiver:

public class MediaBroadcastReceiver extends BroadcastReceiver { 

    public interface MediaBroadcastReceiverInterface{ 
     void MediaBroadcastReceiverCallback();  
    } 

    private MediaBroadcastReceiverInterface mediaBroadcastReceiverInterface;  
    public static final String PROCESS_RESPONSE = "com.xxx.appname.BroadcastReceiver.MediaBroadcastReceiver.PROCESS_RESPONSE"; 

    public MediaBroadcastReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent){    
     try { 
      mediaBroadcastReceiverInterface = (MediaBroadcastReceiverInterface)context; 
      mediaBroadcastReceiverInterface.MediaBroadcastReceiverCallback(); 
     } 
     catch (ClassCastException e) { 
      Log.i(TAG, "Activity doesn't implement the MediaBroadcastReceiverInterface interface"); 
     } 

    } 
} 

Dies ist IntentService in dem ich die Absicht zum BroadCastReceiver gesendet

public class MediaIntentService extends IntentService { 
    public void send(){    
     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(MediaBroadcastReceiver.PROCESS_RESPONSE); 
     broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);   
     sendBroadcast(broadcastIntent);   
    } 
} 

Vielen Dank für Ihre Hilfe

+0

'von einem BroadcastReceiver erhielt innerhalb eines Activity' registriert Sind Sie sicher, der Broadcastempfänger wird registriert, wenn der Intent ausgelöst wird? In welchen Lifecycle-Methoden registrieren Sie den Broadcast-Receiver (nicht)? – F43nd1r

Antwort

0

Sie registrieren Broadcast in Manifest statisch.Verwenden Sie den Code unter Manifest. In Ihrem Fall schlage ich vor, dass Sie es zur Laufzeit registrieren/abmelden sollten.

<receiver 
     android:name=".BroadcastReceiver.MediaBroadcastReceiver" 
     android:enabled="true" 
     android:exported="true" > 
    <intent-filter android:priority="1000"> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    </receiver> 
+0

Vielen Dank für Ihre Hilfe. Was meinst du mit "Sie registrieren sich statisch ..."? – MDP

+0

statisch registrieren -> BroadcastReceiver im Manifest registrieren. Es ist eine gute Praxis, BroadcastReceiver nur zur Laufzeit zu registrieren/zu entfernen (wenn nicht zwingend erforderlich). – ADM

+0

Ich bearbeitet meine App und registriert/nicht registriert dinamically die BroadcastReceiver innerhalb onCreate()/onDestroy() Methoden, aber das Problem bestehen :( – MDP

0

Ihre Rundfunkempfänger wechseln zu

public class MediaBroadcastReceiver extends BroadcastReceiver { 

    public interface MediaBroadcastReceiverInterface{ 
     void MediaBroadcastReceiverCallback();  
    } 

    private MediaBroadcastReceiverInterface mediaBroadcastReceiverInterface;  
    public static final String PROCESS_RESPONSE = "com.xxx.appname.BroadcastReceiver.MediaBroadcastReceiver.PROCESS_RESPONSE"; 

    public MediaBroadcastReceiver(MediaBroadcastReceiverInterface media) { 
     mediaBroadcastReceiverInterface = media; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent){    
     try { 
      mediaBroadcastReceiverInterface.MediaBroadcastReceiverCallback(); 
     } 
     catch (ClassCastException e) { 
      Log.i(TAG, "Activity doesn't implement the MediaBroadcastReceiverInterface interface"); 
     } 

    } 
} 

Dann entfernen receiver von manifest und registrieren Sie es in Activity wie in

public class ContactDetail extends AppCompatActivity { 
    ... 
      @Override 
       public void onCreate(Bundle bundle){ 
       ... 
       registerReceiver(new MediaBroadcastReceiver(new MediaBroadcastReceiverInterface(){ 
        @Override 
        public void MediaBroadcastReceiverCallback() { 
         //Will be triggered 
        } 
       },new IntentFilter("actionname"); 
       ... 
       } 
    ... 
} 
+0

Vielen Dank für Ihre Hilfe. Sie denken, das Problem, das ich durch die Manifest-Datei verursachen? – MDP

+0

Ich hoffe es, Sie verwenden den Kontext zum Auslösen der Methode, die von der onreceive-Methode gesendet wird, stattdessen können Sie wie oben beschrieben dedizierten Rückruf verwenden –

Verwandte Themen