2012-08-23 72 views
4

我正在開發一個android sms應用程序。以下代碼用於發送短信。現在在onReceive()偵聽之前取消註冊廣播呼叫

public void sendsms(){ 
sendBroadcastReceiver=new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      switch (getResultCode()) { 

       case Activity.RESULT_OK: 
        System.out.println("hereeeeeeeeeeeeeeeeeeeeeeeeeeeeee8888888888888888"); 
        System.out.println("1111111111111111111111111111111111"); 
        Toast.makeText(getBaseContext(), "SMS sent", 
         Toast.LENGTH_SHORT).show(); 
        ContentValues values = new ContentValues(); 
        values.put("address", phoneNumber); 
        values.put("body", message); 
        getContentResolver().insert(Uri.parse("content://sms/sent"), values); 
        afterSend(); 
        break; 

       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
         Toast.LENGTH_SHORT).show(); 
        System.out.println("222222222222222222222222222"); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
         Toast.LENGTH_SHORT).show(); 
        System.out.println("333333333333333333333333333333333"); 
        ContentValues values1 = new ContentValues(); 

        values1.put("address", phoneNumber); 
        values1.put("body", message); 
        getContentResolver().insert(Uri.parse("content://sms/queued"), values1); 
        afterSend(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        System.out.println("44444444444444444444444444"); 
        Toast.makeText(getBaseContext(), "Null PDU", 
         Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        System.out.println("4444444444444444444444444444444444"); 
        Toast.makeText(getBaseContext(), "Radio off", 
         Toast.LENGTH_SHORT).show(); 
        break; 



       default: 
        break; 
      }    
     } 
    };  

    registerReceiver(sendBroadcastReceiver , new IntentFilter(SENT)); 


    //--- when the SMS hasbeen delivered--- 

    deliveryBroadcastReciever=new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 

      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        System.out.println("okkkkkkkkkkkkkkkkkkkkkkkkkkk"); 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        System.out.println("cancellllllllllllllllllll"); 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      }    
     } 
    }; 

    registerReceiver(deliveryBroadcastReciever, new IntentFilter(DELIVERED)); 


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


    unregisterReceiver(sendBroadcastReceiver); 
    unregisterReceiver(deliveryBroadcastReciever); 
} 

我的問題是,如果我發送短信,廣播註銷的sentsms達到onreceive()。所以的onReceive()開關組(前)是無法訪問的大多數情況下。如果在發送第二個短信時我不寫入註冊呼叫。onreceive()將聽第一個和第二個短信。

所以請在完成onreceive()之後通過取消註冊呼叫來幫助解決此問題。

回答

0

我部分解決了這個問題。 我從sms方法的末尾刪除註銷(廣播)並將其放入onreceive()方法中。因此unregister()僅在達到onreceive()後纔會發生。我的工作代碼粘貼在下面。

public void sendsms(){ 
sendBroadcastReceiver=new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      switch (getResultCode()) { 

       case Activity.RESULT_OK: 
        System.out.println("hereeeeeeeeeeeeeeeeeeeeeeeeeeeeee8888888888888888"); 
        System.out.println("1111111111111111111111111111111111"); 
        Toast.makeText(getBaseContext(), "SMS sent", 
         Toast.LENGTH_SHORT).show(); 
        ContentValues values = new ContentValues(); 
        values.put("address", phoneNumber); 
        values.put("body", message); 
        getContentResolver().insert(Uri.parse("content://sms/sent"), values); 
        afterSend(); 
        break; 

       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
         Toast.LENGTH_SHORT).show(); 
        System.out.println("222222222222222222222222222"); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
         Toast.LENGTH_SHORT).show(); 
        System.out.println("333333333333333333333333333333333"); 
        ContentValues values1 = new ContentValues(); 

        values1.put("address", phoneNumber); 
        values1.put("body", message); 
        getContentResolver().insert(Uri.parse("content://sms/queued"), values1); 
        afterSend(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        System.out.println("44444444444444444444444444"); 
        Toast.makeText(getBaseContext(), "Null PDU", 
         Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        System.out.println("4444444444444444444444444444444444"); 
        Toast.makeText(getBaseContext(), "Radio off", 
         Toast.LENGTH_SHORT).show(); 
        break; 



       default: 
        break; 
      } 
          context.unregister(this);    
     } 
    };  

    registerReceiver(sendBroadcastReceiver , new IntentFilter(SENT)); 


    //--- when the SMS hasbeen delivered--- 

    deliveryBroadcastReciever=new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 

      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        System.out.println("okkkkkkkkkkkkkkkkkkkkkkkkkkk"); 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        System.out.println("cancellllllllllllllllllll"); 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
      context.unregister(this)    
     } 
    }; 

    registerReceiver(deliveryBroadcastReciever, new IntentFilter(DELIVERED)); 


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



} 

現在我的代碼適用於sendBroadcastReceiver。

但在deliveryBroadcastReciever的情況下,接收方()從不聽任何傳遞。所以deliveryBroadcastReciever正在註冊每個發送短信。

所以我試圖用的onStop()

@Override 
protected void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 
      unregister(deliveryBroadcastReceiver); 
      } 

不過的onStop()被註銷最後registerd deliveryBroadcastReceiver對象only.If我兩次發送短信,將有兩個deliveryBroadcastReceiver對象和的onStop()將最後註銷只有對象。請幫助我的朋友。

+0

使用onResume和onPause進行註冊和取消註冊。 – RvdK

+0

@ PoweRoy..Can您可以解釋..我可以如何註冊每一個短信? – sarath

相關問題