android - 发送消息的广播接收器

标签 android android-intent sms broadcastreceiver extras

我正在开发一个发送短信的应用程序,我能够收到回复以了解短信是否已发送。 但由于我想确定发送了哪些短信(通过接收者和文本),我使用 extras 将这些信息添加到 intent

效果很好,但仅适用于我发送的第一条消息。在第一条消息之后,我收到了相同的附加信息,而且我似乎总是发送相同的短信。 实际上每条短信都是正确发送的,所以问题只与“已发送通知”有关。 奇怪的是,当我收到另一条短信时,它又能正常工作(我得到了正确的附加信息),但只收到一条短信。似乎新的短信事件“重置”了已发送消息的广播接收器。

这是我的代码:

class SmsSender{
private final String SENT = "SMS_SENT";
private static SmsSender instance=null;
private BroadcastReceiver br;
SmsSender(){}

    //SINGLETON
public static SmsSender getSmsSender(Context ctx, AddressBook ab, DBManager dbm){
    if(instance==null && ctx!=null){
    instance=new SmsSender();
    instance.ctx=ctx;
    instance.ab=ab;
    instance.dbm=dbm;
    instance.setBR();
    }
    return instance;
}

private void setBR(){
    br=new BroadcastReceiver(){
         public void onReceive(Context arg0, Intent arg1) 
            {  
                br=null;

                switch (getResultCode())                
                {              
                case Activity.RESULT_OK:  
                    if(arg1.hasExtra("text") && arg1.hasExtra("receiver")){
                            Log.i("SMS","SMS sent to "+arg1.getStringExtra("receiver")+": "+arg1.getStringExtra("text"));
                    }
                break;
                    .....
                 }
            }
        };

        ctx.registerReceiver(br, new IntentFilter(SENT));

}

public void send(String phoneNumber, String text) {
    String nums[]=phoneNumber.split(",");


    for(int i=0; i<nums.length; ++i){
    if(nums[i]!="" && text!=""){
                SmsManager sms = SmsManager.getDefault();

                ArrayList<String> parts = sms.divideMessage(text);
                messageCount = parts.size();
                ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount);
                Intent myIntent=new Intent(SENT);

                **myIntent.putExtra("receiver", nums[i]);
                myIntent.putExtra("text", text);**

                for (int j = 0; j < messageCount; j++){
                    sentIntents.add(PendingIntent.getBroadcast(ctx, 0, myIntent,0));
                }

                    sms.sendMultipartTextMessage( nums[i].trim(), null, parts, sentIntents, null);
            }else{
            Notifica.notify(ab.getContactName(nums[i])+": Error sending SMS",ctx);
            }}


 }}

怎么了?

最佳答案

最后我只用替换这一行就解决了问题:

sentIntents.add(PendingIntent.getBroadcast(ctx, 0, myIntent,0));

用这个:

sentIntents.add(PendingIntent.getBroadcast(ctx, 0, myIntent,PendingIntent.FLAG_UPDATE_CURRENT));

来自文档:

FLAG_UPDATE_CURRENT ...如果所描述的 PendingIntent 已经存在,则保留它,但用这个新 Intent 中的内容替换它的额外数据。如果您正在创建只有 extras 发生变化的 intents,并且不关心收到您之前的 PendingIntent 的任何实体将能够使用您的新 extras 启动它,即使它们没有明确提供给它,也可以使用它。

关于android - 发送消息的广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10372015/

相关文章:

android - 强制 Phonegap(Android) 启动画面方向

java - 在 Android 上捕获和拦截 ACTION_SEND Intent

Android Intent 的节电模式( Lollipop )

php - 任何人都知道如何使用 nexmo 短信 api 接收短信到 php 脚本

Android 错误 : java. lang.NoClassDefFoundError: [generic]

android - Nexus 7 编译时没有出现按钮

java - Android Studio 3 的代理问题

android - 为什么从MainActivity到AnotherActivity的 Intent 不起作用?

android - 为什么 Android ContentObserver 的 onChange() 没有被调用?

java - 安卓短信上下文菜单