Системные службы недоступны для Activity до onCreate(), но не созданы свойства
Я пытаюсь создать службу, которая проверяет наличие активного подключения к Интернету и сообщает об этом. Я понятия не имею, что не так с моим кодом.
Я знаю, что этот вопрос задавался много раз, но большинство ответов, как это, утверждают
- что нельзя создать деятельность, используя
new
ключевое слово (см. этот пост); - что свойства, которые создаются, также являются причиной проблемы (см. этот пост).
Теперь, насколько я знаю, я избежал вышеупомянутых причин. Это мой упрощенный код:
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(); } }
Менеджер приложений
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; } }
Ошибка происходит на линии, обозначенной ВТОРОЙ МАРКЕРОМ, который получает услугу подключения к системе и проверяет наличие Wi-Fi. Это услуга, которую нельзя вызывать раньше onCreate()
,
Кроме того, если я удалю или прокомментирую строку, обозначенную FIRST MARKER, ошибка исчезнет, но, конечно же, служба не запустится.
В чем может быть проблема?
1 ответ
Вы не можете обойти Context
путем сериализации в связке.
В IntentService
который я предполагаю ваш ConnectionService
есть, просто используйте this
для действительного Context
,