我正在尝试创建一项服务,检查设备是否具有活动的互联网连接并进行报告。我完全不知道我的代码有什么问题。
我知道这个问题已经被问到many times,但大多数答案,例如this,状态
据我所知,我避免了上述原因。这是我的简化代码:
MyActivity
public MyActivity extends SuperActivity {
// No properties are instantiated
// No onCreate(Bundle) method
}
超活性
public SuperActivity extends Activity {
ApplicationManager appMgr;
UIManager uiMgr;
// No properties are instantiated, only declared
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
this.appMgr = new ApplicationManager(this);
this.appMgr.getUIManager().init();
}
}
ApplicationManager
public ApplicationManager {
// No properties are instantiated
SuperActivity activity;
Thread serviceThread;
UIManager uiMgr;
ApplicationManager(SuperActivity activity) {
this.activity = activity;
this.uiMgr = new UIManager(this);
}
void initService() {
this.serviceThread = new Thread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(getActivity(), ConnectionService.class);
intent.putExtra("CONTEXT", getActivity());
intent.putExtra("ALLOW_MOBILE_CONNECTION", true);
getActivity().startService(intent);
}
});
}
void startService() {
this.serviceThread.start();
}
UIManager getUIManager() {
return this.uiMgr;
}
SuperActivity getActivity() {
return this.activity;
}
}
UIManager的
public class UIManager {
// No properties are instantiated
void init() {
getApplicationManager().initService();
getApplicationManager().startService(); // <-- FIRST MARKER,
// see below
}
}
ConnectionService
public class ConnectionService {
@Override
protected Bundle onHandleIntent(Intent intent) {
Bundle params = intent.getExtras();
Bundle bundle = new Bundle();
Context cntxt = (Context) params.getSerializable("CONTEXT");
try {
boolean wifi =
NetworkUtils.hasWifiCon(cntxt); // <-- SECOND MARKER,
// see below
...
}
catch (SocketException exc) { ... }
return bundle;
}
}
错误发生在SECOND MARKER表示的行上,该行获取系统连接服务并检查wifi。这是在onCreate()
之前不允许调用的服务。
此外,如果我删除或评论FIRST MARKER表示的行,则错误消失,当然,服务也没有启动。
可能是什么问题?
答案 0 :(得分:2)
您无法通过将其序列化来传递Context
。
在我假设您IntentService
的{{1}}中,只需使用ConnectionService
获取有效的this
。