2013-03-04 24 views
0

我已经做了阶级和阶级构造里面我创建了一个广播接收器短信和在完成方法类我做注销的reciver。Android的 - 异常敲定有广播接收器类中

现在:我的应用程序有3个选项卡每个选项卡有活动时,我做我的创建类的实例活动的的OnCreate(当前活动创建广播接收器)和调用OnStop我完成的类。

问题是,当我在标签中移动很多时候,我得到强制关闭应用程序与异常作为本文中的最后一个节目。

MYCLASS CODE:

package com.example.tawasol1; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.util.Log; 
import android.widget.Toast; 

import com.example.tawasol1.Cls_stringManager.MessageType; 
import com.example.tawasol1.Cls_stringManager.QueryMessge; 

abstract class RecieverEvents{ 
    abstract void OnAccountNotRegistered(String Sender,String Message,String Provider); 
    abstract void OnAccountNoBalance(String Sender,String Message,String Provider); 
    abstract void OnAccountActivatedOk(String Sender,String Message,String Provider); 
    abstract void OnAccountRegisterNoMoney(String Sender,String Message); 
    abstract void OnMessage(String Sender,String Message,String FromNumber); 
    abstract void OnEnvitationMessage(String Sender,String Message,String FromNumber); 


} 

public class Cls_CreateReceiver { 
    private Context mContext ; 
    private RecieverEvents mReceiverEvnts ; 
    private BroadcastReceiver CurrentReceiver ; 
    private String smsSender ; 
    private String smsBody ; 
// private Intent CheckPage ; 



    Cls_CreateReceiver(Context c ,int Priority, RecieverEvents RecEvents){ 
     mContext =c ; 
     mReceiverEvnts = RecEvents ; 


     //====================== Body Of receiver 

     IntentFilter fp=new IntentFilter(); 
     fp.addAction("android.provider.Telephony.SMS_RECEIVED"); 
     fp.setPriority(Priority); 


     CurrentReceiver = new BroadcastReceiver(){ 

      @Override 
      public void onReceive(Context conx, Intent recIntent) { 



        //===================== Get Message Extras 
       Bundle IntExtras = recIntent.getExtras() ; 
       if (IntExtras == null) 
         return; 
       Object[] pdus = (Object[]) IntExtras.get("pdus"); 

       // get message from bundle intent 
       for (int i = 0; i < pdus.length; i++) { 

         SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); 
         smsSender = SMessage.getOriginatingAddress(); 
         smsBody = SMessage.getMessageBody().toString(); 

         }  

        //======================End Message Extras  

       Boolean isSystemMessage = false ; 
       QueryMessge retMsgQuery = QueryMessge.None ;  

       cls_database smsCheck = new cls_database(mContext) ; 
       Cls_stringManager StrManager = new Cls_stringManager(); 


       isSystemMessage = smsCheck.isOurSystemMessage(smsSender); 

       //================= isSystemMessage  
       if (isSystemMessage) 
       { 
       this.abortBroadcast() ; 





         if (StrManager.isQueryMessage(smsBody)) 
         { 

          Log.d("isQueryMessage:", "YES"); 

          retMsgQuery = StrManager.GetQueryMsg(smsBody) ; 

          switch (retMsgQuery) { 
          case None: 
           // Toast.makeText(c,"Error Message Query Type" , Toast.LENGTH_LONG).show(); 
          break; 

          case NoBalance : 
           mReceiverEvnts.OnAccountNoBalance(smsSender, smsBody, ""); 
            break ; 
          case AccountActivated : 

           mReceiverEvnts.OnAccountNotRegistered(smsSender, smsBody, ""); 
           break ; 
          case NoRegisteredAccount : 
           mReceiverEvnts.OnAccountNotRegistered(smsSender, smsBody, "") ; 

           break ; 
          default : 
           Log.d("Receiver Other Msg:", smsBody); 
           Log.d("Receiver Other Msg:", smsSender); 

           if(smsSender.equals("TASHBIK")) 
           { 
            Log.d("Receiver Other Msg:Tashbik", smsBody); 
            mReceiverEvnts.OnAccountRegisterNoMoney(smsSender, smsBody) ; 

           } 

          } //switch Case 




         }//StrManager.isQueryMessage 
         else 
         { 
          Log.d("isQueryMessage:", "NOT"); 

          if (StrManager.isAccountExpireNoRegistered(smsBody)){ 
           mReceiverEvnts.OnAccountNotRegistered(smsSender, smsBody, "") ; 
          return; 
          } 

          if (StrManager.isNoBalaceMessage(smsBody)){ 
           mReceiverEvnts.OnAccountNoBalance(smsSender, smsBody, "") ; 
          return; 
          } 


          String ChatterMobile = "" ; 
          String ChatterMessage="" ; 

          MessageType MsgType = MessageType.None ; 

          MsgType = StrManager.GetMessageType(smsBody); 


          Log.d("Reciver>HasBody:", StrManager.hasBody(smsBody).toString()); 
          Log.d("Reciver>HasMobile:", StrManager.hasMobile(smsBody).toString()); 

          Log.d("Reciver>Mobile:", StrManager.GetMobileFromMessage(smsBody)); 
          Log.d("Reciver>Msg:", StrManager.GetMessageBody(smsBody)); 

          if(StrManager.hasMobile(smsBody)) 
           ChatterMobile = StrManager.GetMobileFromMessage(smsBody); 

          if (StrManager.hasBody(smsBody)) 
           ChatterMessage = StrManager.GetMessageBody(smsBody); 



          switch (MsgType) { 
          case Chatting: 
           mReceiverEvnts.OnMessage(smsSender, smsBody, "CHAT"); 
           break; 
          case DirectMessage: 
           mReceiverEvnts.OnMessage(smsSender, ChatterMessage.trim(), ChatterMobile.trim()); 
           break; 
          case Invitation : 
           mReceiverEvnts.OnEnvitationMessage(smsSender, smsBody, ChatterMobile.trim()); 
           break ; 
          default: 

           if(smsSender.equals("TASHBIK")) 
           { 
            Log.d("Receiver Other Msg:Tashbik", smsBody); 
            mReceiverEvnts.OnAccountRegisterNoMoney(smsSender, smsBody) ; 

           } 

           break; 
          } 








         }//StrManager.isQueryMessage 

       }//================= isSystemMessage or Not 





      } // End onReceive event 

}; 
//====================End Of Receiver 


     mContext.registerReceiver(CurrentReceiver,fp); 

} //End Of Constructor 

public void UnregisterReceiver(){ 
    mContext.unregisterReceiver(CurrentReceiver); 

} 


@Override 
protected void finalize() throws Throwable { 

    mContext.unregisterReceiver(CurrentReceiver); 

    super.finalize(); 
} 



} 

错误日志:

03-04 14:48:57.331: E/System(22346): Uncaught exception thrown by finalizer 
03-04 14:48:57.331: E/System(22346): java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
03-04 14:48:57.331: E/System(22346): at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:654) 
03-04 14:48:57.331: E/System(22346): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1297) 
03-04 14:48:57.331: E/System(22346): at com.example.tawasol1.Cls_CreateReceiver.finalize(Cls_CreateReceiver.java:223) 
03-04 14:48:57.331: E/System(22346): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:186) 
03-04 14:48:57.331: E/System(22346): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169) 
03-04 14:48:57.331: E/System(22346): at java.lang.Thread.run(Thread.java:856) 
+0

finalize()真的不是注销接收者的好地方。您是否尝试将其移动到例如onPause()回调活动? – sandrstar 2013-03-04 12:58:20

+0

在完成类我做注销接收器,但在OnStop事件活动我做finalize类。 – Realbitt 2013-03-04 13:01:00

回答

0

onCreate方法被称为仅第一次你的活动创建(或者,如果这一个已经完成)

但一旦Activity不再可见,就会调用onStop方法

因此,下一次你Activity没有显示,您尝试注销您的接收机,它已经注册的

您可以将Receiver创作移到onResume方法被称为你的Activity显示每次

你可以看到Activity生命周期here

+0

选项卡会在您移动到另一个选项卡时销毁活动,并创建选定的选项卡。所以我认为OnCreate和OnStop是创建和销毁接收器的正确地方。 – Realbitt 2013-03-04 13:28:15

+0

你使用什么样的Tab组件? – 2013-03-04 15:35:42

+0

合成>> Tabhost – Realbitt 2013-03-05 00:54:23