2015-06-11 20 views
5

Bu, bir Broadast'ı dinlemek için anında yayınladığım bir BroadcastReceiver'ım var, bundan sonra da kaydını kaldırmak istiyorum.Alıcının kendi onReceive() yönteminden 'dinamik' BroadcastReceiver kaydını silmek tamam mı?

ben bu şekilde yapar herhangi bir örnek kod bulamadım ama bu yasaklar android çevrimiçi docs herhangi bir kuralı bulduk de. Ancak, aktiviteyi sürdürdüğü sürece etrafta takılmasına izin veremem, ve yine de anonim bir sınıftayım, bu yüzden içerdiği sınıf değişken ismini bile bilmiyor. ,

myInfoReceiver = new BroadcastReceiver() { 
onReceive(Context ctx, Intent intt) { 
    // do some Notification when I get here 
    nm.notify("I got here") // obvious pseudo code 
    ctx.unregisterReceiver(myInfoReceiver); 
} // end onReceive 
ctx.registerReceiver),uInfoReceiver, new IntentFilter(...)); 
}; // end BroadcastReceiver 

Ama bu çalıştırdığınızda o alıcı (Ben bire bir aynısını unutmak kaydını silmek olmadığını ısrar ederek kaydını çağırdığında, Android şikayet: is

, kod şöyle görünür ama IllegalArgumentException attı).

Ben de beklendiği gibi 'INTT' eylem aynı olup olmadığını kontrol etmek kodunu değiştirme çalıştı - ama sonra yine executest sessizce OnReceive ama kaydını başarısız olur.

+0

neler gol sen misin ulaşmak ister misin? Sanırım, 'BroadcastReceiver' probleminiz için yanlış seçim olabilir. Bir kez bir işlem yapmak ve bunu etkinlik yaşam döngüsünden bağımsız yapmak istiyorsanız, olay veri yolu ile (ör. Otto) "IntentService" veya "Service" kullanmayı düşünün. –

+0

IntentService vb. Kullanmazdım, çünkü bu daha büyük sistemde zaten istediğim bilgiyi tam olarak temsil eden bir yayın niyetine sahip. Ayrıca, yaşam döngüsünden çok fazla bağımsızlığa ihtiyacım yok. Zaten bu amaç için bekleyen UI iş parçacığımdayım, hiçbir şey yapmadan bir ilerleme iletişim kutusu gösteriyorum. –

cevap

5

sorunuzun cevabı "evet" tir. Ancak ...

... Eğer üzerinde registerReceiver() denilen aynı Context üzerinde unregisterReceiver() çağırmanız gerekir. Gönderdiğiniz kodda, onReceive()'a bir bağımsız değişken olarak geçen Context numaralı telefondan unregisterReceiver() numaralı telefonu arayın. Bu aynı Context değil, bu yüzden istisna alıyorsunuz.

+0

Şimdi bir süredir bağlamdan şüphe duydum. Kesin kesinlik için teşekkürler. –

+0

Şu anda bu problemle karşı karşıyayım. Etrafında iyi bir iş var mı? – user2892437

0

Sadece EVET derdim hiç sorun.

Ben mesela bir kerelik yeri düzeltme için kullanmak ve beni de buna herhangi bir sorun görmeden başka mantık kullanılabilir. Ben birçok kez gördüm Artı

.

+0

Ben de "hiç sorun değil" diye düşünürdüm. Ama ben IllegalArgumentException alıyorum. Bir fikrin neden? Kendi onReceive() yönteminde hala nasıl kaydedilemez? –

+0

Alıcıyı kaydederken doğru alıcı nesnesini geçerken, yukarıdaki kodda bir yanlış eşleşme görebildiğim için – 7383

+0

Sadece bunu aynı 'Bağlam 'olarak adlandırmanız yeterlidir. Örneğin bir "Etkinlik" için "Etkinliğim" gibi bir şey kullanın. Aksi halde, stacktrace'i gönderin. – shkschneider

0

Sonunda o şekilde yapıyorum çeşitli çözümler, denedim:

Kaydol:

MyApplication.getInstance().getApplicationContext().registerReceiver(sentReceiver, new IntentFilter(SENT)); 

SentReceiver: MyApplication ile

public class SentReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent arg1) { 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(context, 
         context.getString(R.string.sms_envoye), Toast.LENGTH_SHORT) 
         .show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(context, 
         context.getString(R.string.sms_defaillance_generique), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(context, 
         context.getString(R.string.sms_pas_de_service), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(context, 
         context.getString(R.string.sms_pas_de_pdu), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(context, 
         context.getString(R.string.sms_radio_desactivee), 
         Toast.LENGTH_SHORT).show(); 
       break; 
     } 
     MyApplication.getInstance().getApplicationContext().unregisterReceiver(this); 
    } 

:

public class MyApplication extends Application { 
    private static MyApplication mInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 
    } 

    public static synchronized MyApplication getInstance() { 
     return mInstance; 
    }   
}