You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Android中java.lang.Throwable: setStateLocked异常?

解决跳转Activity时出现的java.lang.Throwable(AccessibilityManager相关)问题

首先,我们来拆解你遇到的问题:从SplashScreenActivity跳转到HorizontalNtbActivity时,在setContentView方法触发了关联AccessibilityManager.setStateLocked的Throwable,同时你的网络检查逻辑也存在一些潜在问题,这些可能相互影响导致异常。

一、问题根源分析

  1. 网络检查工具类的不合理设计:你在isInternetConnection方法中直接弹出AlertDialog,这个操作如果在Activity生命周期的敏感阶段执行(比如跳转前),会干扰Activity的正常启动流程,甚至导致上下文混乱,间接触发系统服务(比如AccessibilityManager)的异常。
  2. 冗余的网络判断:SplashScreenActivity中重复写了两次if (CheckInternet.isInternetConnection(...)),完全没必要,反而增加了逻辑复杂度。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:49