Android:无法实例化接收器

时间:2012-10-23 13:26:59

标签: java android broadcastreceiver runtimeexception

我正在开发一个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上的另一篇帖子建议我这样做的话。

如果那不是原因,那么是什么?任何帮助将不胜感激。

1 个答案:

答案 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);
}