我正在开发一个Android应用程序,它接收SMS消息并在应用程序中使用这些数据。因为我想在关闭应用程序时关闭SMS消息'BroadCastreceiver,所以我将它放在主要活动中:
public class App extends Activity {
public class SmsReceiver extends BroadcastReceiver {
...
}
...
}
它被添加到清单中:
<receiver android:name=".App.SmsReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
活动正常,直到我收到短信。然后我得到以下错误:
10-23 15:01:50.019: E/AndroidRuntime(10161): java.lang.RuntimeException: Unable to instantiate receiver be.allys.msgwall.app.App.SmsReceiver: java.lang.ClassNotFoundException: be.allys.msgwall.app.App.SmsReceiver in loader dalvik.system.PathClassLoader[/data/app/be.allys.msgwall.app-1.apk]
这是因为接收器类在另一个类中吗?这对我来说似乎是一个可能的原因,如果不是因为StackOverflow上的另一篇帖子建议我这样做的话。
如果那不是原因,那么是什么?任何帮助将不胜感激。
答案 0 :(得分:3)
当您在清单中注册一个类别的接收者时,您应该在清单中声明接收者名称,如 OuterClass $ interClass 。
<receiver android:name=".App$SmsReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
编辑1:您应该动态注册接收器,因此您需要两个方法,例如下面的代码段,然后您可以在 onResume 中调用registerSMSReceiver
活动并在 onPause 中调用unRegisterSMSReceiver
。这将解决您的问题。
private void registerSMSReceiver()
{
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(receiver, filter);
}
private void unRegisterSMSReceiver()
{
unregisterReceiver(receiver);
}