0

我正在创建一个短信应用程序来处理 2 个用户定义列表的接收短信操作。对于每个列表,我创建了一个活动和 xml 文件,例如 favourite_list.xml 和 contact_list.xml。在这些 xml 文件中有 2 个切换按钮。我要做的是,每当收到短信时,了解每个切换按钮的状态(开/关)。

这是我的 SmsReceiver 类

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ToggleButton;
import android.telephony.SmsMessage;

public class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;

        if (bundle != null)
        {
            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];    
            String str="";
            for (int i=0; i<msgs.length; i++){                                                  
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                str += "SMS from " + msgs[i].getOriginatingAddress();  
            }    
        }     
    }        
}

我知道我应该使用 findViewById() 来达到按钮的状态,但我不能直接使用它,因为 SmsReceiver 不是从 Activity 扩展的。到目前为止,我尝试使用 findViewById

1- 将上下文投射到 Activity

try{                    
    tb = (ToggleButton) ((Activity)context).findViewById(R.id.toggleButton3);
    if(tb.isChecked())
        Log.d("sms","SOUND-ON");
    else if(!tb.isChecked())
        Log.d("sms","SOUND-OFF");
}catch(Exception e){
    Log.d("sms","Error " + e);
}

它给出了 java.lang.ClassCastException: android.app.ReceiverRestrictedContext

2- 使用 LayoutInflater

try{
    LayoutInflater mInf = LayoutInflater.from(context);
    View myView = mInf.inflate(R.layout.activity_favorite_list, null);
    tb = (ToggleButton) myView.findViewById(R.id.toggleButton3);
    if(tb.isChecked())
        Log.d("sms","SOUND-ON");
    else if(!tb.isChecked())
        Log.d("sms","SOUND-OFF");
}catch(Exception e){
    Log.d("sms","Error" + e);
} 

这也不起作用,因为它仅在应用程序启动时提供切换按钮的状态。请帮忙,谢谢。

4

2 回答 2

1

如果您ToggleButton在这两个活动中的每一个中都有一个,则可以使用两个首选项字段,每次修改其状态时都会写入活动中。在 中,BroadcastReceiver您将使用相同的首选项字段来查看ToggleButton的状态。

如果您ToggleButton在两个活动的列表的每一行中都有一个,那么您将使用相同的方法,只需要使用另一个结构来保存所有行中的所有值(例如String,每行的 ToggleButton状态将是一个由 a 分隔的值分隔符(如|))。

于 2012-08-30T16:49:35.610 回答
0

要使活动中的字段在活动中可用,BroadcastReceiver您可以BroadcastReceiver在活动中创建匿名类

     //within activity
          BroadcastReceiver receiver ;
          ToggleButton tb;

   //         within on create
    receiver =  new BroadcastReceiver(){
        public void onReceive(Context p1, Intent p2)
        {
                  // access tb here         
        }
    };
于 2012-08-30T17:53:44.107 回答