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小时内奖励你的赏金。”似乎现在不能给赏金,我会在我能给的时候给