2013-08-30 75 views
-6

我创建了一个具有两个活动和SMS Receiver类的应用程序。该应用的目的是在接收到特定文本/ SMS消息时改变两种活动中的某些事物的状态,例如,检查CheckBox或切换ToggleButton,即使两个活动都没有打开,我也需要这样做。例如,应用程序可能会收到一条文本消息,告诉应用程序更改活动1和活动2中切换按钮的状态,问题是如果活动2尚未打开,则会导致应用程序崩溃(如果活动两个在此之前打开然后它不会崩溃)。即使活动二未被打开,我也需要应用程序来执行应用程序。当应用程序崩溃我得到的logcat此错误
Caused by: java.lang.NullPointerException
这发生在我的接收器类的187线(这是我改变活动两个切换按钮的状态)
现在我的猜测是,这是因为活动二还没有打开,活动二中的按钮和其他东西尚未初始化/识别,因此接收者不知道它指向什么。
解决这个问题的好方法是什么?当应用第一次启动时,是否可以在后台打开第二个活动?或者我应该在其他地方声明我的切换按钮?
我对此很新,所以任何反馈都会很棒!谢谢!

接收器类:
由于'由于:java.lang.NullPointerException'错误而导致应用程序崩溃

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

发布您的代码,请 – Andrain

+3

这将是连击发布您的代码和错误日志然后解释它。 –

+1

发布了我的接收器类 – AndroidCB

回答

2

嘿你是在东西越来越例外这样的代码

your_toggle_button.setChecked(true); 

上面的代码是其他类,而不是your_toggle_button活动,因为你不能碰您的活动的孩子,如果活动没有运行,为了达到这个目的,你必须将你的值保存在某个变量中,并在你启动该视图的活动并在该活动中获取该值并相应地改变视图的状态时通过意图发送它。

所以始终牢记活动时没有运行,你不能碰任何活动的看法,甚至当你没有初始化视图

+1

谢谢,这就是非常有帮助。那么当应用第一次启动时,是否有可能在后台启动第二项活动? – AndroidCB

+0

你想要什么第一个活动在前景和同一时间秒在背景?如果是,那么**这是不可能的** –

+1

是否可以在启动时启动活动2,然后直接切换到活动1? – AndroidCB

相关问题