在onCreate()之前,活动无法使用系统服务,但没有实例化属性

时间:2015-01-24 16:32:42

标签: android system-services

我正在尝试创建一项服务,检查设备是否具有活动的互联网连接并进行报告。我完全不知道我的代码有什么问题。

我知道这个问题已经被问到many times,但大多数答案,例如this,状态

  • 无法使用new关键字创建活动(请参阅this post);
  • 实例化的属性也是问题的原因(参见this post)。

据我所知,我避免了上述原因。这是我的简化代码:

  • 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表示的行,则错误消失,当然,服务也没有启动。

可能是什么问题?

1 个答案:

答案 0 :(得分:2)

您无法通过将其序列化来传递Context

在我假设您IntentService的{​​{1}}中,只需使用ConnectionService获取有效的this