在 onCreate() 之前,系统服务对 Activity 不可用,但没有实例化属性
System services not available to Activities before onCreate(), but no properties instantiated
我正在尝试创建一项服务来检查设备是否具有活动的互联网连接并进行报告。我完全不知道我的代码有什么问题。
我知道有人问过这个问题many times, but most answers, like this,状态
- 无法使用
new
关键字创建 activity(参见 this post);
- 实例化的属性也是问题的原因(请参阅 this post)。
现在据我所知,我已经避免了上述原因。这是我的简化代码:
MyActivity
public MyActivity extends SuperActivity {
// No properties are instantiated
// No onCreate(Bundle) method
}
SuperActivity
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 表示的行,错误就消失了,当然,服务也没有启动。
可能是什么问题?
您不能通过将 Context
序列化为一个包来传递它。
在我假设你的 ConnectionService
的 IntentService
中,只需使用 this
作为有效的 Context
.
我正在尝试创建一项服务来检查设备是否具有活动的互联网连接并进行报告。我完全不知道我的代码有什么问题。
我知道有人问过这个问题many times, but most answers, like this,状态
- 无法使用
new
关键字创建 activity(参见 this post); - 实例化的属性也是问题的原因(请参阅 this post)。
现在据我所知,我已经避免了上述原因。这是我的简化代码:
MyActivity
public MyActivity extends SuperActivity { // No properties are instantiated // No onCreate(Bundle) method }
SuperActivity
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 表示的行,错误就消失了,当然,服务也没有启动。
可能是什么问题?
您不能通过将 Context
序列化为一个包来传递它。
在我假设你的 ConnectionService
的 IntentService
中,只需使用 this
作为有效的 Context
.