2011-05-30 9 views
5

http://mobiforge.com/developing/story/sms-messaging-androidAmaçlardan birden çok yayın alma?

Yukarıdaki bağlantıda kullandığım örnek bağlantı kodunu SMS göndermek için kendi uygulamamda kullandım, ancak iletinin gönderilen durumunu denetlerken bir soruna rastlıyorum. Ne olursa olsun, göndermeye çalıştığım her mesaj için tost mesajı açılır. Yani temel olarak, daha önce 3 mesaj yolladığımı varsayalım. 4. mesajımı gönderdiğimde, tost mesajı 4 kez açılır. Görünüşe göre BroadcastReceiver, şu ana kadar kullanılan her amaçtan aynı yayını alıyor gibi görünüyor mu? Bunun neden olduğunu ya da nasıl durduracağını tam olarak anlayamıyorum. Herhangi bir yardım veya anlayış büyük takdir edilecektir!

İşte bu neden belirli bir yöntemdir:

//---sends an SMS message to another device--- 
private void sendSMS(String phoneNumber, String message) 
{   
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(DELIVERED), 0); 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    //---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break;       
      } 
     } 
    }, new IntentFilter(DELIVERED));   

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);   
} 
+0

Sorunu çoğaltmak için gereken minimum kodu tamamlayabiliyor musunuz? –

+0

Orijinal gönderiimi, – John

cevap

9

Önce, bir new BroadcastReceiver(){ Eğer sendSMS diyoruz her zaman var, bu yüzden onlar, sen sendSMS denen kişi daha her zaman yığmak. Her bir BroadcastReceiver'un alt kısmına unregister(this); ekleyebilirsin, ancak Broadcast alıcısını bu işlevin dışına taşımak daha iyi olurdu. Sen Hiç pendingIntent Eğer Android'i yardım bekleyen Intents'in daha iyi ayırt etmek gerekir senin yanında veri göndermek istiyorsanız bu link

okumak,
onResume() içinde bir ve unregister o

onPause(). yılında İkinci kayıt + oluşturabilir ..
örn.

PendingIntent deliveredPI = PendingIntent.getBroadcast(this, uniqueIdPerSMS++, 
    new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT); 
+0

numaralı soruna neden olan yöntemi ekleyerek düzenleyeceğim, işe yaradı. – Atmaram

+0

Merhaba Ben aynı sorunla karşı karşıyayım 1 gelen alıcıdan gelen mesajları almak için 1 hizmet başlattı alıyorum. Bundan sonra bu servisten o mesajları belirli numaraya gönderirim. Ve gönderen mesaj için yukarıdaki gibi aynı kodu kullandım (John tarafından gönderildi). Benim sorunum mesaj gönderdiğimde "SMS SENT" mesajı sürekli olarak gelecek. Peki bunu sadece bir kez nasıl alabilirim? – anddev

+0

çekicilik gibi çalışıyor! thanx :) –

0

bu Aksi takdirde daha sonra android hepsi aynı dikkate alır ve tüm sms yıllardan için deliveredPi herhangi birinin sonucunu gösterecektir çünkü o, her deliveredPI için benzersiz bir kimlik kullanmak basit (bilmiyorum ilk veya son ise).