Android 如何等待AsyncTask中发送的确认短信?

Android 如何等待AsyncTask中发送的确认短信?,android,android-asynctask,broadcastreceiver,smsmanager,Android,Android Asynctask,Broadcastreceiver,Smsmanager,我正在尝试在AsyncTask中发送几条消息,并希望跟踪已发送消息的进度。感谢@cYrixmorten在这个主题上发表的精彩文章,我已经完成了我想做的大部分事情。这是我的密码: @Override public void onCreate(Bundle savedInstanceState) { sentReceiver = new BroadcastReceiver() { @Override public voi

我正在尝试在AsyncTask中发送几条消息,并希望跟踪已发送消息的进度。感谢@cYrixmorten在这个主题上发表的精彩文章,我已经完成了我想做的大部分事情。这是我的密码:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        sentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context c, Intent in) {
                switch (getResultCode()) {
                case Activity.RESULT_OK:
                    break;
                default:
                    break;
                }
            }
        };
        getActivity().registerReceiver(sentReceiver, new IntentFilter(
                SENT));
    }


    public class SomeAsyncTask extends
            AsyncTask<ArrayList<Person>, Integer, Void> {
        private ProgressDialog dialog;
        private Context context;

        public SomeAsyncTask(Activity activity) {
            context = activity;
            dialog = new ProgressDialog(context);
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        }

        protected void onPreExecute() {
            this.dialog.show();
        }

        @Override
        protected Void doInBackground(ArrayList<Person>... params) {
            dialog.setMax(params[0].size());
            SmsManager mySMS = SmsManager.getDefault();

            for (int i = 0; i < params[0].size(); i++) {
                    Intent sentIn = new Intent(SENT);
                    PendingIntent sentPIn = PendingIntent.getBroadcast(context,
                            i, sentIn, 0);
                    mySMS.sendTextMessage(params[0].get(i).getNum(),
                                null, message, sentPIn, null);

// HERE I NEED TO WAIT TO RECEIVE CONFIRMATION THAT MESSAGE IS SENT AND 
// THEN I CAN PUBLISH PROGRESS. HOW TO DO THAT RESULT IN onReceive() IN BroadcastReceiver()?

                    publishProgress((int) ((i / (float) params[0].size()) * 100));

            }

            return null;

        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            dialog.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Void v) {

        }
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
sentReceiver=新广播接收器(){
@凌驾
接收时公共无效(上下文c,意图中){
开关(getResultCode()){
案例活动。结果\u正常:
打破
违约:
打破
}
}
};
getActivity().registerReceiver(sentReceiver,新的IntentFilter(
),;
}
任务扩展的公共类
异步任务{
私人对话;
私人语境;
公共任务(活动){
上下文=活动;
dialog=新建进度对话框(上下文);
设置ProgressStyle(ProgressDialog.STYLE_水平);
}
受保护的void onPreExecute(){
this.dialog.show();
}
@凌驾
受保护的Void doInBackground(ArrayList…params){
dialog.setMax(参数[0].size());
SmsManager mySMS=smsmsmanager.getDefault();
对于(int i=0;i

我在代码中添加了解释。所以,在我继续发送其他消息之前,我需要知道消息是否已发送。实现这一点的最佳方法是什么?

您必须为发送的意图过滤器注册一个广播接收器,在那里您可以获得发送消息的事件。以布尔值为例

bool isMessageSent= false; 

    registerReceiver(new BroadcastReceiver(){
                @Override
                public void onReceive(Context arg0, Intent arg1) {
                    switch (getResultCode())
                    {
                        case Activity.RESULT_OK:
                            // set boolean here to true 
                             isMessageSent = true; 
                            break;
                        case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                            // handle your result
                            break;
                        case SmsManager.RESULT_ERROR_NO_SERVICE:
                             // handle your result
                            break;
                        case SmsManager.RESULT_ERROR_NULL_PDU:
                             // handle your result
                            break;
                        default:
                            // handle your result
                            break;
                    }
                }
            }, new IntentFilter(SENT)); 
现在,在doInBackground方法中,添加while循环作为

while(!isMessageSent) {

}

当消息将被发送时,此循环将被终止,下一条消息将被发送。

可能需要将一些全局标志设置为
false
,然后等待
onReceive
将其设置为
true
?@user330486,它可以工作!我设置了一个全局布尔变量,并在AsyncTask中放置了一个无限“while”循环,只有在“onCreate()”中将该布尔变量设置为“true”时,该循环才会退出。如果消息从未发送,这将以无限循环结束。@GaneshKrishnan不仅如此,建议的
while()
循环是一个紧密的循环。最后,室内应该有一个100毫秒左右的睡眠时间。