即使我添加了一个空的构造函数,我也没有这个着名的错误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" />
我怎么解决?谢谢
答案 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
(或Activity
,BroadcastReceiver
)。 Android
系统在内部为您完成此操作。启动服务的正确方法是startService()
使用Intent
,而不是通过调用new YourService()
之类的内容。
在您的情况下,只需删除此行:
private BackService() { }
..并确保您正确启动Service
。