Android-包含broadcastreceiver的异常完成类

Android-包含broadcastreceiver的异常完成类,android,Android,我创建了一个类,在类构造函数中,我为SMS创建了一个广播接收器,并在finalize方法类中取消注册接收器 现在:我的应用程序有3个选项卡,每个选项卡都有活动,当我创建类的实例(为当前活动创建BroadcastReceiver)时,创建活动的OnCreate,并且OnStop我完成类的定稿 问题是,当我在标签中移动很多次时,我得到了强制关闭应用程序,这是本文最后一次显示的例外 MYCLASS代码: package com.example.tawasol1; import android.con

我创建了一个类,在类构造函数中,我为SMS创建了一个广播接收器,并在finalize方法类中取消注册接收器

现在:我的应用程序有3个选项卡,每个选项卡都有活动,当我创建类的实例(为当前活动创建BroadcastReceiver)时,创建活动的OnCreate,并且OnStop我完成类的定稿

问题是,当我在标签中移动很多次时,我得到了强制关闭应用程序,这是本文最后一次显示的例外

MYCLASS代码:

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();
} 



}

onCreate
方法仅在第一次创建活动时调用(或者如果此活动已完成)

但是只要
活动不再可见,就会调用
onStop
方法

因此,下次您的
活动
未显示时,您将尝试注销已注销的接收器

您可以将您的
接收器
创建移动到
onResume
方法,该方法在每次显示
活动
时调用


您可以看到,
活动
生命周期

finalize()确实不是注销接收器的好地方。例如,您是否尝试将其移动到activity onPause()callback?在finalize类中,我会注销receiver,但在activity的OnStop事件中,我会将其移动到finalize类。当您移动到另一个选项卡并创建所选选项卡时,这些选项卡会破坏活动。所以我认为OnCreate和OnStop是创建和销毁接收器的正确位置。您使用的是哪种选项卡组件?
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: com.example.tawasol1.Cls_CreateReceiver$1@41d64278
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)