Receiver not registered: android.widget.ZoomButtonsController crash android

本文详细介绍了在将公司APP适配到大屏安卓电视设备时遇到的WebView闪退BUG,并分享了一种有效的解决方法,即重写finish方法,通过获取顶级视图并移除所有View来避免缩放时退出崩溃。

最近把公司APP适配到一个大屏安卓电视设备上时,遇到了一个奇怪的BUG,只要退出某个WebView时,就会闪退。异常信息如下:

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController$1@bdd2e5a
	at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:765)
	at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1683)
	at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:511)
	at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:404)
	at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loop(Looper.java:135)
	at android.app.ActivityThread.main(ActivityThread.java:5280)
	at java.lang.reflect.Method.invoke(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:372)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:963)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)

于是就各种百度,谷歌,得到的大致都是这种解决方案:


if(webview != null) {
                webview.getSettings().setBuiltInZoomControls(true);
                mWebView.setVisibility(View.GONE);
                long timeout = ViewConfiguration.getZoomControlsTimeout();//timeout ==3000
                Log.i("time==",timeout);
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        mWebView.destroy();
                    }
                }, timeout);
            }

但是我试了以后并没有得到解决,最后用了这种方法解决闪退问题,遇到的朋友可以试一下:

 /**
     * 防止webview缩放时退出崩溃。
     */
    @Override
    public void finish() {
        ViewGroup view = (ViewGroup) getWindow().getDecorView();
        view.removeAllViews();
        super.finish();
    }

重写WebView的finish方法,通过getDecorView:这个方法获取顶级视图,然后移除所有View,问题得到解决。

09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: The log switch is turned on, but the conditions are not met. exceptionInfo = ExceptionInfo{appInfoList=[AppInfo{packageName='com.android.bluetooth', processName='com.android.bluetooth', appName='Bluetooth', versionName='15.0.0', versionCode=35, componentName='java.lang.IllegalArgumentException', isForeground=false}], crashInfo=CrashInfo{exceptionClassName='java.lang.IllegalArgumentException', message='Receiver not registered: com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory$1@a313ee4', stackTrace='java.lang.IllegalArgumentException: Receiver not registered: com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory$1@a313ee4 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1777) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1922) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:832) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory.cleanUp(OplusBluetoothRecorderFactory.java:312) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.oplus.bluetooth.feature.OplusBluetoothFeatureWrapper.deInit(OplusBluetoothFeatureWrapper.java:247) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.oplus.bluetooth.btservice.OplusAdapterServiceExtImpl.oplusCleanup(OplusAdapterServiceExtImpl.java:580) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.bluetooth.btservice.AdapterService.cleanup(AdapterService.java:1564) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.bluetooth.btservice.AdapterState$OffState.enter(AdapterState.java:203) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.util.StateMachine$SmHandler.invokeEnterMethods(StateMachine.java:1042) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.util.StateMachine$SmHandler.performTransitions(StateMachine.java:888) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:828) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.os.Handler.dispatchMessage(Handler.java:107) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.os.Looper.loopOnce(Looper.java:282) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.os.Looper.loop(Looper.java:387) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.app.ActivityThread.main(ActivityThread.java:9500) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at java.lang.reflect.Method.invoke(Native Method) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: '}, anrInfo=null, eventType='java_crash', time=1757930727413, timeZone='GMT+05:30', count=1, fileId='ef7ea072-fa86-4b66-8dac-7e2aaea2df19', filePath='null', fileDir='null'} 分析一下这段日志
09-23
这段日志涉及 **OPPO 定制 ROM 的滚动到顶部功能(`OplusScrollToTopManager`)** 和 **权限请求界面(`GrantPermissionsActivity`)** 的交互问题。以下是详细解析: --- ### **1. 错误核心信息** - **`D OplusScrollToTopManager`** - `D` 表示 **Debug 级别** 的日志,属于 OPPO 定制功能的调试信息。 - **`IllegalArgumentException: Receiver not registered`** - 关键错误:尝试取消注册一个 **未注册的广播接收器**(`SystemUIBroadcastReceiver`)。 - 触发位置:`OplusScrollToTopManager` 在 `CheckPermissionActivity` 和 `GrantPermissionsActivity` 关闭时调用。 --- ### **2. 错误调用链分析** 1. **场景还原**: - 两个 Activity(`CheckPermissionActivity` 和 `GrantPermissionsActivity`)尝试调用 `unregisterSystemUIBroadcastReceiver()`。 - 但系统发现对应的接收器 **从未注册过**(或已提前被销毁),抛出异常。 2. **OPPO 定制逻辑问题**: - `OplusScrollToTopManager` 可能 **未正确管理接收器的生命周期**,导致重复取消注册或时序错误。 --- ### **3. 可能的原因** - **生命周期不同步** - Activity 的 `onDestroy()` 被调用时,`OplusScrollToTopManager` 仍尝试取消注册接收器,但接收器已被系统自动清理。 - **多 Activity 共享接收器冲突** - `GrantPermissionsActivity` 和 `CheckPermissionActivity` 可能共享同一个接收器实例,但其中一个已释放资源。 - **OPPO ROM 版本兼容性问题** - 定制代码未正确处理 Android 原生生命周期或权限请求流程的变化。 --- ### **4. 影响范围** - **功能降级**: - 滚动到顶部功能可能失效(但非常用功能,用户感知较弱)。 - **潜在内存泄漏**: - 接收器未正确注销可能导致资源残留(需结合 `dumpsys meminfo` 验证)。 --- ### **5. 解决方案** #### **(1)临时规避** - **清除相关应用缓存**: ```bash adb shell pm clear com.oplus.padconnect adb shell pm clear com.google.android.permissioncontroller ``` #### **(2)长期修复(需 OPPO 介入)** - **防御性编程**: 修改 `OplusScrollToTopManager`,在取消注册前检查接收器状态: ```java try { context.unregisterReceiver(receiver); } catch (IllegalArgumentException e) { // 接收器未注册,忽略错误 Log.d(TAG, "Receiver already unregistered"); } ``` - **统一生命周期管理**: 确保接收器的注册/取消注册严格配对,例如在 `onCreate()` 和 `onDestroy()` 中同步调用。 --- ### **6. 调试建议** - **检查接收器注册历史**: ```bash adb shell dumpsys activity broadcasts | grep "OplusScrollToTopManager" ``` - **监控 Activity 生命周期**: ```bash adb shell am monitor | grep -E "GrantPermissionsActivity|CheckPermissionActivity" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值