0

我正在开发一个接收 SMS 消息并在应用程序中使用此数据的 android 应用程序。因为我希望在关闭应用程序时关闭 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 上的另一篇文章建议我这样做的话,这对我来说似乎是一个可能的原因。

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

4

1 回答 1

3

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

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

编辑1:您应该动态注册接收器,因此您需要有两种方法,如下面的代码片段,然后您可以调用Activity的registerSMSReceiveronResume并调用onPauseunRegisterSMSReceiver。这将解决您的问题。

private void registerSMSReceiver()
{
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(receiver, filter);
}

private void unRegisterSMSReceiver()
{
    unregisterReceiver(receiver);
}
于 2012-10-23T13:34:08.593 回答