我创建了一个包含两个活动和一个SMS Receiver类的应用程序。该应用程序的目的是在接收到特定文本/ SMS消息时改变两个活动中某些事物的状态,例如,检查CheckBox或切换ToggleButton,我需要它来执行此操作,即使两个活动都没有打开。例如,应用程序可能会收到一条文本消息,告诉应用程序更改活动一和活动二中的切换按钮的状态,问题是如果活动二尚未打开,那么它将使应用程序崩溃(如果活动在此之前打开两个然后它不会崩溃)。即使活动二没有打开,我也需要应用程序才能这样做。当应用程序崩溃时,我在logcat中收到此错误
Caused by: java.lang.NullPointerException
这发生在我的接收器类的第187行(这是我在活动二中更改切换按钮的状态)
现在我的猜测是,这是因为活动二尚未打开,活动二中的按钮和其他内容尚未初始化/识别,因此接收器不知道它指向的是什么。
什么是解决这个问题的好方法?有没有办法在应用程序首次启动时在后台打开第二个活动?或者我应该在其他地方声明我的切换按钮?
我对此非常陌生,所以任何反馈都会很棒!谢谢!
接收机类:
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
Global.SMSarray = new char[20];
Global.controlNumAr = new char[11];
//Global.controlNumAr = Global.controlNum.toCharArray();
if (extras ==null)
return;
Object[] pdus = (Object[]) extras.get("pdus");
for (int i = 0; i < pdus.length; i++) {
SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
Global.sender = SMessage.getOriginatingAddress();
String body = SMessage.getMessageBody().toString();
Global.SMSarray = body.toCharArray();
Intent in = new Intent("SmsMessage.intent.MAIN").putExtra("get_msg", Global.sender+":"+body);
if (PhoneNumberUtils.compare(Global.controlNum, Global.sender)){
if((Global.SMSarray[0]=='O')&&(Global.SMSarray[1]=='K')){
Toast toast= Toast.makeText(context, "OK",
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, -100);
toast.show();
this.abortBroadcast();
}
else{
//Zone A
if(Global.SMSarray[12]=='a'){
Global.mytbSA.setChecked(false);
Global.mytbSGA.setChecked(false);
Global.BarA.setVisibility(View.INVISIBLE);
Global.mytbSA.setVisibility(View.VISIBLE);
Global.BarGA.setVisibility(View.INVISIBLE);
Global.mytbSGA.setVisibility(View.VISIBLE);
Global.setAButton.setEnabled(true);
Global.unsetAButton.setEnabled(false);
this.abortBroadcast();
context.sendBroadcast(in);
}
else if (Global.SMSarray[12]=='A'){
Global.mytbSA.setChecked(true);
Global.mytbSGA.setChecked(true);
Global.BarA.setVisibility(View.INVISIBLE);
Global.mytbSA.setVisibility(View.VISIBLE);
Global.BarGA.setVisibility(View.INVISIBLE);
Global.mytbSGA.setVisibility(View.VISIBLE);
Global.setAButton.setEnabled(false);
Global.unsetAButton.setEnabled(true);
this.abortBroadcast();
context.sendBroadcast(in);
};
答案 0 :(得分:2)
嘿,你在这个代码
之类的东西上得到了例外your_toggle_button.setChecked(true);
上面的代码是在其他类而不是your_toggle_button活动中,因为如果活动没有运行,你就无法触摸你活动的孩子,为了达到这个目的,你必须将你的价值保存在某个变量中并在你通过意图发送它时启动该视图的活动并在该活动中获取该值并相应地更改视图的状态。
所以请记住,当活动未运行时,即使您没有初始化视图,也无法触及任何活动的视图