无法实例化课程......;没有空的构造函数

时间:2018-03-24 20:27:08

标签: android

即使我添加了一个空的构造函数,我也没有这个着名的错误Can't instantiate class ...; no empty constructor,但它并没有解决问题。这是代码:

public class BackService extends Service {
    private BackService() { }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    SmsListener SmsListener = new SmsListener();
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        registerReceiver(SmsListener, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

        return START_STICKY;
    }
}

并在清单中:

   <service android:name="MainActivity$BackService" />

我怎么解决?谢谢

4 个答案:

答案 0 :(得分:0)

创建构造函数public或消除该零参数构造函数。拥有private零参数构造函数将无法工作,因为框架无法使用它。

此外,这需要是static类,因为从<service>元素开始,它似乎位于MainActivity内(这很奇怪)。

答案 1 :(得分:0)

需要可以访问空构造函数。您可以将其定义为public

public BackService() { }

或者只是完全删除它并使用默认构造函数(因为该类没有其他构造函数)。

答案 2 :(得分:0)

如果您希望仅在用户可以看到您的活动时收到有关新短信的通知,请执行以下操作:

完全删除服务

将此行移至活动onCreate

SmsListener SmsListener = new SmsListener();

将此行移至活动onResume

registerReceiver(SmsListener, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

将此行添加到活动onPause

unregisterReceiver(SmsListener);

否则,如果您希望始终收到有关新短信的通知,只需在项目中添加广播接收器:

<receiver android:name=".SmsListener" >
    <intent-filter android:priority="500">
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

答案 3 :(得分:0)

不应明确构建Service(或ActivityBroadcastReceiver)。 Android系统在内部为您完成此操作。启动服务的正确方法是startService()使用Intent,而不是通过调用new YourService()之类的内容。

在您的情况下,只需删除此行:

private BackService() { }

..并确保您正确启动Service