拆分MainActivity代码后传递Context获取系统服务崩溃的正确方式
解决"System services not available to Activities before onCreate()"崩溃问题
嘿,这个崩溃的原因其实很明确——你踩了一个Android开发里的常见小坑:
你把Static类继承了AppCompatActivity,但你只是用new Static()手动创建了它的实例,这个类根本没经过Android系统的Activity生命周期流程(比如onCreate方法完全没被系统调用)。而Activity只有在系统完成初始化后才能获取系统服务,所以当你调用它的getSystemService时,就会抛出那个错误。
更关键的是:这个工具类根本不需要继承Activity! 我们只需要用传入的Context来获取系统服务就够了。
正确的修改方案
首先,把你的工具类改成普通类(不要继承任何Activity相关类),并且建议改成有意义的名字(比如NetworkUtils,避免和Java关键字static混淆):
public class NetworkUtils { // 改成静态方法,不用创建实例就能调用 public static boolean isNetworkAvailable(Context context) { // 直接用传入的Context获取系统服务 ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); // 简化判断逻辑,同时检查网络是否真的处于连接状态 return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } // 把你的setData方法也放在这里,按需调整参数 public static void setData(String response) { // 这里实现你的数据处理逻辑 } }
然后修改MainActivity里的调用代码,直接使用静态方法,不用创建工具类实例:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); getData("2B1A4D3C"); } public void getData(String Hex) { // 直接传入MainActivity的Context即可 if (NetworkUtils.isNetworkAvailable(this)) { // 这里注意response变量需要你提前定义好(比如从接口请求获取) NetworkUtils.setData(response); } } }
额外注意事项
- 别忘了在
AndroidManifest.xml中添加网络状态权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 工具类用静态方法可以避免不必要的对象实例化,更符合工具类的设计原则
- 从Android 10(API 29)开始,部分网络状态的获取有更严格的限制,但基础的网络可用性检查用上面的方法完全没问题
内容的提问来源于stack exchange,提问作者ekavet
相关产品推荐
相关产品推荐

