4

我正在开发一个 android 短信应用程序。我用来发送短信的以下代码。

 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().So onReceive() 开关 block() 之前未注册的广播在大多数情况下是无法访问的。如果我不写 unregister 调用,那么在发送第二个 sms 时onreceive()。将同时监听第一个和第二个 sms 。

因此,请在完成后通过取消注册呼叫来帮助解决此问题onreceive()

4

1 回答 1

0

我部分解决了这个问题。我从 sms 方法的末尾删除了 unregister(broadcast) 并将其放入 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 的情况下,receiver() 永远不会收听任何交付。所以deliveryBroadcastReciever 正在注册每个发送短信。

所以我尝试了 onstop()

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

但是 onStop() 仅取消注册最后注册的deliveryBroadcastReceiver 对象。如果我发送两次短信,将有两个deliveryBroadcastReceiver 对象,onstop() 将仅取消注册最后一个对象。请朋友们帮帮我。

于 2012-08-23T07:35:52.287 回答