在BroadcastReceiver中使用findViewById

时间:2012-08-30 16:34:53

标签: android broadcastreceiver findviewbyid

我正在创建一个短信应用,用于处理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-将上下文转换为活动

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);
} 

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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         
        }
    };