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