我已经编写了一个服务,它应该被告知连接的变化。我为此编写了一个 BroadcastReceiver:
public class ConnectivityBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager con = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// ...
}
}
并且我已经将它添加到我的 AndroidManifest.xml 中:
<application> <!-- ... -->
<receiver android:name="com.mycompany.mobile.android.services.impl.ConnectivityBroadcastReceiver"
android:label="NetworkConnection">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
</application>
但是当我尝试这样注册我的接收器时:
class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.registerReceiver(new ConnectivityBroadcastReceiver(this), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
return START_STICKY;
}
}
我得到了一个 NPE:
java.lang.NullPointerException
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:308)
at com.mycompany.mobile.android.services.impl.MyService.onStartCommand(...)
它出现在我调用 registerReceiver 的行中。 ConnectivityBroadcastReceiver 和 IntentFilter 都不能为 null,还是我错了?我错过了实现方法吗? onStarCommand 中的调用是否非法?
最佳答案
您可能很久以前就解决了您的问题,但该解决方案可能对 google wanderers 有用。
我在 IntentService
中有相同的 NPE。我试图在该服务的构造函数中注册接收器。当我将注册移动到 onHandleIntent()
时它开始工作。
此外,我不需要比我的应用生命周期更长的接收器,所以我只是在 AndroidManifest
之外创建并注册了它。
看起来像这样:
private final BroadcastReceiver connectivityReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
//do your thing
}
};
public MyService() {
super("MyService");
}
@Override
protected void onHandleIntent(Intent intent) {
registerReceiver(connectivityReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
//do your thing
}
关于java - 调用 registerBroadcast 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034283/