我正在创建一个短信应用,用于处理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);
}
这也不起作用,因为它在应用程序启动时仅提供切换按钮的状态。请帮助,谢谢。
答案 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
}
};