0

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

我知道这个问题已经被问过很多次了,但是大多数答案,像这样,状态

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

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

  • 我的活动

    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;
        }
    }
    
  • 用户界面管理器

    public class UIManager {
    
        // No properties are instantiated
    
        void init() {
            getApplicationManager().initService();
            getApplicationManager().startService(); // <-- FIRST MARKER,
                                                    //     see below
        }
    
    }
    
  • 连接服务

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

可能是什么问题呢?

4

1 回答 1

2

您不能通过将 aContext序列化成一个包来传递它。

IntentService我假设你ConnectionService的情况下,只需使用this有效的Context.

于 2015-01-24T16:39:54.800 回答