Системные службы недоступны для 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,

Другие вопросы по тегам