Android 如何更改广播机onReceive中的静态变量

Android 如何更改广播机onReceive中的静态变量,android,broadcastreceiver,Android,Broadcastreceiver,我想获得每个电话号码的发送状态,因此我定义了一个变量statusMap来记录状态,0表示成功,1表示失败。我在onReceive函数中为statusMap赋值,但之后statusMap的值仍然为空。如何更改onReceive函数中的静态值 package com.mem.memsms; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; i

我想获得每个电话号码的发送状态,因此我定义了一个变量
statusMap
来记录状态,0表示成功,1表示失败。我在
onReceive
函数中为
statusMap
赋值,但之后statusMap的值仍然为空。如何更改
onReceive
函数中的静态值

package com.mem.memsms;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class SendMessage extends Activity {
private EditText editText;
private Button button;
private Intent intent;
private SendBroadcast mSendReceiver;

private HashMap<String, String> hashMap;
private HashMap<String, String> statusMap = new HashMap<String, String>();
private Queue<String> numbers;
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";

@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_send_message);
    editText = (EditText) this.findViewById(R.id.message);
    intent = getIntent();
    hashMap = (HashMap<String, String>) intent.getSerializableExtra("data");
    numbers = new LinkedList<String>();

    button = (Button) this.findViewById(R.id.sendmessage);
    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            numbers.clear();
            editText.setEnabled(false);
            final String text = editText.getText().toString();
            if (text.trim() == "") {
                editText.setHint(R.string.msg_null);
                return;
            }
            Iterator<Entry<String, String>> iter = hashMap.entrySet()
                    .iterator();
            while (iter.hasNext()) {
                Map.Entry<String, String> entry = (Map.Entry<String, String>) iter
                        .next();
                String number = entry.getKey();
                String content = entry.getValue();
                numbers.offer(number);
                Sendmsg(number, content + text);
            }
            intent.putExtra("data2", statusMap);
            setResult(RESULT_OK, intent);
            //Log.i("msg", "statusMap length is" + statusMap.size());
            // back to contacts
            SendMessage.this.finish();
        }

    });

}

private class SendBroadcast extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String n = numbers.poll();
        switch (getResultCode()) {
        case RESULT_OK:
            Log.i("msg", "c:ok" + n);
            statusMap.put(n, "0");
            break;

        default:
            Log.i("msg", "c:failed" + n);
            statusMap.put(n, "1");
            break;
        }
    }
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    this.unregisterReceiver(mSendReceiver);
    super.onPause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub

    mSendReceiver = new SendBroadcast();
    IntentFilter mSendFilter = new IntentFilter(SENT_SMS_ACTION);
    this.registerReceiver(mSendReceiver, mSendFilter);
    super.onResume();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.send_message, menu);
    return true;
}

private void Sendmsg(String number, String content) {

    Intent sentIntent = new Intent(SENT_SMS_ACTION);
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,
            0);
    //sentIntent.putExtra("status", statusMap);
    SmsManager manager = SmsManager.getDefault();
    manager.sendTextMessage(number, null, content, sentPI, null);

}
}
package com.mem.memsms;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.LinkedList;
导入java.util.Map;
导入java.util.Map.Entry;
导入java.util.Queue;
导入android.os.Bundle;
导入android.app.Activity;
导入android.app.pendingent;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.telephony.smsmsmanager;
导入android.util.Log;
导入android.view.Menu;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
公共类SendMessage扩展活动{
私人编辑文本;
私人按钮;
私人意图;
专用发送广播mSendReceiver;
私有HashMap;
私有HashMap statusMap=新HashMap();
专用队列号;
字符串SENT\u SMS\u ACTION=“SENT\u SMS\u ACTION”;
字符串DELIVERED\u SMS\u ACTION=“DELIVERED\u SMS\u ACTION”;
@抑制警告(“未选中”)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u send\u message);
editText=(editText)this.findViewById(R.id.message);
intent=getIntent();
hashMap=(hashMap)intent.getSerializableExtra(“数据”);
数字=新的LinkedList();
按钮=(按钮)this.findViewById(R.id.sendmessage);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
数字。清除();
editText.setEnabled(false);
最终字符串text=editText.getText().toString();
如果(text.trim()==“”){
setHint(R.string.msg_null);
返回;
}
迭代器iter=hashMap.entrySet()
.iterator();
while(iter.hasNext()){
Map.Entry=(Map.Entry)iter
.next();
字符串编号=entry.getKey();
字符串内容=entry.getValue();
数字。报价(数字);
Sendmsg(数字、内容+文本);
}
intent.putExtra(“数据2”,状态图);
设置结果(结果正常,意图);
//Log.i(“msg”,“statusMap长度为”+statusMap.size());
//返回联系人
SendMessage.this.finish();
}
});
}
私有类SendBroadcast扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
//TODO自动生成的方法存根
字符串n=numbers.poll();
开关(getResultCode()){
个案结果(正常):
Log.i(“msg”,“c:ok”+n);
statusMap.put(n,“0”);
打破
违约:
Log.i(“消息”,“c:失败”+n);
statusMap.put(n,“1”);
打破
}
}
}
@凌驾
受保护的void onPause(){
//TODO自动生成的方法存根
这是未注册的接收人(mSendReceiver);
super.onPause();
}
@凌驾
受保护的void onResume(){
//TODO自动生成的方法存根
mSendReceiver=新发送广播();
IntentFilter mSendFilter=新的IntentFilter(已发送\u SMS\u操作);
此.registerReceiver(mSendReceiver,mSendFilter);
super.onResume();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.send_message,menu);
返回true;
}
私有void Sendmsg(字符串编号、字符串内容){
意向Sentinent=新意向(已发送短信或行动);
pendingent sentPI=pendingent.getBroadcast(this,0,sentinent,
0);
//Sentinent.putExtra(“状态”,状态图);
SmsManager manager=smsmsmanager.getDefault();
sendTextMessage(number,null,content,sentPI,null);
}
}
删除此项:

intent.putExtra("data2", statusMap);
        setResult(RESULT_OK, intent);
        //Log.i("msg", "statusMap length is" + statusMap.size());
        // back to contacts
        SendMessage.this.finish();
从onClick编码并将其放入onReceive:

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    String n = numbers.poll();
    switch (getResultCode()) {
    case RESULT_OK:
        Log.i("msg", "c:ok" + n);
        statusMap.put(n, "0");
        break;

    default:
        Log.i("msg", "c:failed" + n);
        statusMap.put(n, "1");
        break;
    }
    if(hashMap.size()==statusMap.size()){
        intent.putExtra("data2", statusMap);
        SendMessage.this.setResult(RESULT_OK, intent);
        //Log.i("msg", "statusMap length is" + statusMap.size());
        // back to contacts
        SendMessage.this.finish();
   }
}

问题是,onClick事件首先完成,即调用set result并完成此活动,然后调用onReceive,因此在地图更新时,结果已发送

onReceive正在调用??嗯,当然,这是一个回调函数。当我使用Logcat时,日志可以打印在那里。有人能看看这个吗?提前谢谢!尝试检查onReceive最后一行中statusMap的大小您想更改哪个静态变量?如果将这样的代码段放入onReceive中,则在第一次调用onReceive时,将发送intent with statusMap,然后完成。statusMap将只有一个元素。在onReceive中,只需检查它是否是最后一条消息a,这应该可以工作,如果有时我只需要添加新成员以防结果确定,这将不起作用。您的答案在这里仍然有效,对于这个问题是否有更通用的解决方案。发送消息的事件在您设置结果之后出现,所以这是正确的方法。也别忘了接受ans。“你可以在14小时内奖励你的赏金。”似乎现在不能给赏金,我会在我能给的时候给