如何解决Android中java.lang.Throwable: setStateLocked异常?
解决跳转Activity时出现的java.lang.Throwable(AccessibilityManager相关)问题
首先,我们来拆解你遇到的问题:从SplashScreenActivity跳转到HorizontalNtbActivity时,在setContentView方法触发了关联AccessibilityManager.setStateLocked的Throwable,同时你的网络检查逻辑也存在一些潜在问题,这些可能相互影响导致异常。
一、问题根源分析
- 网络检查工具类的不合理设计:你在
isInternetConnection方法中直接弹出AlertDialog,这个操作如果在Activity生命周期的敏感阶段执行(比如跳转前),会干扰Activity的正常启动流程,甚至导致上下文混乱,间接触发系统服务(比如AccessibilityManager)的异常。 - 冗余的网络判断:
SplashScreenActivity中重复写了两次if (CheckInternet.isInternetConnection(...)),完全没必要,反而增加了逻辑复杂度。 - AccessibilityManager异常:从栈信息看,这个Throwable是系统辅助服务初始化时抛出的,可能是第三方辅助服务(如屏幕阅读器、悬浮窗工具)冲突,也可能是布局初始化时的上下文问题导致系统服务调用失败。
二、分步解决方案
1. 重构网络检查逻辑,分离业务与提示
把弹窗提示从工具类中剥离,让调用Activity自己处理用户提示,避免工具类持有上下文导致的生命周期问题:
修改CheckInternet.java(仅保留网络检查功能)
public static boolean isInternetConnection(Context mcontext) { ConnectivityManager conMgr = (ConnectivityManager) mcontext.getSystemService(Context.CONNECTIVITY_SERVICE); if (conMgr == null) { return false; } NetworkInfo netInfo = conMgr.getActiveNetworkInfo(); // 严谨判断:网络不为空且已连接 return netInfo != null && netInfo.isConnected(); }
修改SplashScreenActivity.java(优化跳转逻辑+处理无网络提示)
// 去掉重复的网络判断 if (CheckInternet.isInternetConnection(SplashScreenActivity.this)) { Log.e(TAG, "device is online"); Intent i = new Intent(SplashScreenActivity.this, HorizontalNtbActivity.class); startActivity(i); // 跳转后立即finish SplashActivity,避免返回栈混乱 finish(); } else { Log.e(TAG, "device is offline"); // 在当前Activity上下文弹出提示,确保生命周期安全 new AlertDialog.Builder(SplashScreenActivity.this) .setIcon(R.drawable.ic_sad) .setTitle("No Internet Connection") .setMessage("Please Enable Internet Connection Then Try Again.") .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); // 用户确认后退出App,或让用户手动设置网络 finish(); } }) .setCancelable(false) .show(); }
2. 处理AccessibilityManager相关异常
针对系统辅助服务的异常,我们可以做以下处理:
方式一:捕获异常避免崩溃
在HorizontalNtbActivity的onCreate中捕获该Throwable,防止App直接崩溃:
@Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.activity_horizontal_ntb); } catch (Throwable e) { Log.e(TAG, "Failed to set content view", e); // 可选:加载一个备用的极简布局,引导用户重启App setContentView(R.layout.activity_error_fallback); return; } checkPermissionNew(); initUI(); }
方式二:排查布局与系统环境
- 检查
activity_horizontal_ntb.xml:确保根布局是合法的ViewGroup(如LinearLayout、ConstraintLayout),没有使用错误的控件或非法的布局参数。 - 测试时关闭第三方辅助服务:在设备的「设置-辅助功能」中关闭所有非系统自带的辅助服务(如各类悬浮球、屏幕翻译工具),看异常是否消失。
三、额外建议
- 避免在Activity启动/跳转的敏感阶段执行弹窗、耗时操作等,确保生命周期流程顺畅。
- 网络检查建议使用
ConnectivityManager.NetworkCallback替代过时的getActiveNetworkInfo(适配Android 10+),不过这属于优化项,当前问题解决后再考虑也可以。
内容的提问来源于stack exchange,提问作者Android Developer
相关产品推荐
相关产品推荐

