-6

我创建了一个包含两个活动和一个 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);
                };
4

1 回答 1

2

嘿,你在这样的代码上遇到了异常

your_toggle_button.setChecked(true);

上面的代码在其他类而不是 your_toggle_button 活动中,因为如果活动没有运行,您将无法触摸活动的孩子,要实现这一点,您必须将您的值保存在某个变量中,并在您开始活动时通过意图发送它该视图并在该活动中获取该值并相应地更改视图的状态。

所以永远记住,当活动没有运行时,即使你没有初始化视图,你也不能触摸任何活动的视图

于 2013-08-30T08:56:55.427 回答