Java Android:无法实例化接收器

Java Android:无法实例化接收器,java,android,broadcastreceiver,runtimeexception,Java,Android,Broadcastreceiver,Runtimeexception,我正在开发一个android应用程序,它接收SMS消息并在应用程序中使用这些数据。因为我想在关闭应用程序时关闭SMS消息的广播接收器,所以我将其放置在主活动中: public class App extends Activity { public class SmsReceiver extends BroadcastReceiver { ... } ... } 它被添加到清单中: <receiver android:name=".App.SmsReceiver" >

我正在开发一个android应用程序,它接收SMS消息并在应用程序中使用这些数据。因为我想在关闭应用程序时关闭SMS消息的广播接收器,所以我将其放置在主活动中:

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>
这是因为receiver类在另一个类中吗?如果不是因为StackOverflow上的另一篇帖子建议我这样做的话,这对我来说似乎是一个可能的原因


如果这不是原因,那是什么?非常感谢您的帮助。

当您在清单中注册一个作为类间的接收方时,您应该在清单中声明接收方名称,如下所示OuterClass$interClass

<receiver android:name=".App$SmsReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

当您在清单中注册作为类间的接收方时,您应该在清单中声明接收方名称,如下所示OuterClass$interClass

<receiver android:name=".App$SmsReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

你试过写SmsReceiver的完整路径吗?@Neko我的答案解决了你的问题了吗?“如果是的,请承认。”我在工作后接受了你的答案。很抱歉没有就此留言。您是否尝试过写入SmsReceiver的完整路径?@Neko我的答案解决了您的问题了吗?“如果是的,请承认。”我在工作后接受了你的答案。抱歉,没有就此留言。这不会使错误消失。还有其他想法吗?@Neko将接收器设为静态类,然后再试一次。这是可行的,但给我留下了与以前相同的问题。我希望每当活动关闭时,BroadcastReceiver都会关闭,这样每当我收到sms消息时,它就不会启动我的应用程序。根据我所阅读的内容,当活动停止时,有时不会调用onDestroy()。您最好将注册和注销与“恢复”和“暂停”事件联系起来。折衷的办法是,当活动尚未真正消失时,您将获得更多的取消注册/注册对。在活动生命周期中,接收器的注册位置取决于您想要什么,以及您在onReceive中编写的代码。例如,您将在onReceive方法中更新UI,然后需要在onResume和onPause之间注册接收器。这并不会使错误消失。还有其他想法吗?@Neko将接收器设为静态类,然后再试一次。这是可行的,但给我留下了与以前相同的问题。我希望每当活动关闭时,BroadcastReceiver都会关闭,这样每当我收到sms消息时,它就不会启动我的应用程序。根据我所阅读的内容,当活动停止时,有时不会调用onDestroy()。您最好将注册和注销与“恢复”和“暂停”事件联系起来。折衷的办法是,当活动尚未真正消失时,您将获得更多的取消注册/注册对。在活动生命周期中,接收器的注册位置取决于您想要什么,以及您在onReceive中编写的代码。例如,您将在onReceive方法中更新UI,然后需要在onResume和onPause之间注册接收方。
private void registerSMSReceiver()
{
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(receiver, filter);
}

private void unRegisterSMSReceiver()
{
    unregisterReceiver(receiver);
}