Caused by: java.lang.IllegalArgumentException: Receiver not registered

38 篇文章 0 订阅
20 篇文章 0 订阅

问题描述

在APN Settings界面按返回键回到移动网络设置菜单的时候crash,Settings出现ANR。

日志分析

点击进入APN Settings界面,telephony_apn_key是APN菜单的KEY

06-07 17:03:49.474  1330  4629 I wm_create_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity,android.settings.APN_SETTINGS,NULL,NULL,0]
06-07 17:03:49.475  1330  4629 I wm_pause_activity: [0,156097406,com.android.settings/.SubSettings,userLeaving=true,resumeTopActivity]
06-07 17:03:49.481 16827 16827 I sysui_multi_action: [757,830,758,4,833,1571,854,telephony_apn_key]
06-07 17:03:49.482 16827 16827 I wm_on_top_resumed_lost_called: [156097406,com.android.settings.SubSettings,topStateChangedWhenResumed]

06-07 17:03:49.621  1330  1522 I wm_activity_launch_time: [0,179774007,com.android.settings/.Settings$ApnSettingsActivity,145]

SubSettings是APN的上层界面信息

06-07 17:03:49.491 16827 16827 I wm_on_paused_called: [156097406,com.android.settings.SubSettings,performPause,8]

06-07 17:03:49.492  1330  4674 I wm_add_to_stopping: [0,156097406,com.android.settings/.SubSettings,makeInvisible]

重启APN界面

06-07 17:03:49.495  1330  4674 I wm_restart_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity]
06-07 17:03:49.500  1330  4674 I wm_set_resumed_activity: [0,com.android.settings/.Settings$ApnSettingsActivity,realStartActivityLocked - onActivityStateChanged]

06-07 17:03:49.552 16827 16827 I wm_on_create_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,performCreate,40]
06-07 17:03:49.558 16827 16827 I wm_on_start_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,handleStartActivity,7]

06-07 17:03:49.561 16827 16827 I wm_on_resume_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,RESUME_ACTIVITY,2]

退出APN Settings界面

06-07 17:03:57.271  1330  5477 I wm_finish_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity,app-request]

06-07 17:03:57.272  1330  5477 I wm_pause_activity: [0,179774007,com.android.settings/.Settings$ApnSettingsActivity,userLeaving=false,finish]

06-07 17:03:57.275 16827 16827 I wm_on_top_resumed_lost_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,topStateChangedWhenResumed]

06-07 17:03:57.277  1330  4629 V ActivityManager: Unregister receiver: android.content.IIntentReceiver$Stub$Proxy@d243000
06-07 17:03:57.277 16827 16827 I wm_on_paused_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,performPause,1]
06-07 17:03:57.277  1330  4629 I wm_add_to_stopping: [0,179774007,com.android.settings/.Settings$ApnSettingsActivity,completeFinishing]

06-07 17:03:57.491  1330  1526 I WindowManager: Win Window{d1f2507 u0 com.android.settings/com.android.settings.Settings$ApnSettingsActivity}: affectsSystemUi=true

06-07 17:03:57.709  1330  1525 V ActivityTaskManager: Removing activity from finish-imm:transit: token=ActivityRecord{ab72237 u0 com.android.settings/.Settings$ApnSettingsActivity t11 f}}, app=com.android.settings
06-07 17:03:57.709  1330  1525 I wm_destroy_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity,finish-imm:transit]

06-07 17:03:57.794 16827 16827 D ApnSettings: onDestroy: mUnavailable=false06-07 17:03:57.794 16827 16827 D ApnSettings: onDestroy: mUnavailable=false

运行时错误,在界面销毁的时候无法取消监听,因为接收器没有注册。

--------- beginning of crash
06-07 17:03:57.795 16827 16827 E AndroidRuntime: FATAL EXCEPTION: main
06-07 17:03:57.795 16827 16827 E AndroidRuntime: Process: com.android.settings, PID: 16827
06-07 17:03:57.795 16827 16827 E AndroidRuntime: java.lang.RuntimeException: Unable to destroy activity {com.android.settings/com.android.settings.Settings$ApnSettingsActivity}: java.lang.IllegalArgumentException: Receiver not registered: com.android.settings.network.apn.ApnSettings$2@e89b29406-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:6030)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:6062)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:46)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:282)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:256)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2689)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:107)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.os.Looper.loopOnce(Looper.java:232)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:317)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:8751)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:617)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
 

具体的代码类和方法行数

06-07 17:03:57.795 16827 16827 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.android.settings.network.apn.ApnSettings$2@e89b294
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1695)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1898)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:822)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at com.android.settings.network.apn.ApnSettings.onDestroy(ApnSettings.java:428)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.Fragment.performDestroy(Fragment.java:3376)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:812)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:346)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.SpecialEffectsController$FragmentStateManagerOperation.complete(SpecialEffectsController.kt:664)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.SpecialEffectsController$Operation.cancel(SpecialEffectsController.kt:507)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.SpecialEffectsController.forceCompleteAllOperations(SpecialEffectsController.kt:293)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3037)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2988)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:346)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:258)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.Activity.performDestroy(Activity.java:9331)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1561)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:6017)
06-07 17:03:57.795 16827 16827 E AndroidRuntime:     ... 14 more

系统强制关闭crash的应用

06-07 17:03:57.798  1330  4629 W ActivityTaskManager:   Force finishing activity com.android.settings/.SubSettings
06-07 17:03:57.798  1330  4629 I wm_finish_activity: [0,156097406,11,com.android.settings/.SubSettings,force-crash]

06-07 17:03:57.801  1330 16950 D AES     : ExceptionLog: notify aed, process:com.android.settings pid:16827 cause:system_app_crash 

06-07 17:03:57.804  1330  1523 I ActivityManager: Showing crash dialog for package com.android.settings u0

显示crash 弹窗

06-07 17:03:57.804  1330  1523 I ActivityManager: Showing crash dialog for package com.android.settings u0

出现ANR,关闭应用界面

06-07 17:04:02.859  1330 16958 I ActivityManager: Crashing app skipping ANR: com.android.server.am.ProcessErrorStateRecord@79fd407 Input dispatching timed out (ed1f18b com.android.settings/com.android.settings.SubSettings (server) is not responding. Waited 5002ms for FocusEvent(hasFocus=false)).

06-07 17:04:08.416  1330  4629 I ActivityManager: Killing 16827:com.android.settings/1000 (adj 0): crash
06-07 17:04:08.416  1330  4629 I ActivityManager: note: ProcessRecord{13b6c9b 16827:com.android.settings/1000} is being killed, reason: 4, sub-reason: 0, message: crash

06-07 17:04:08.417  1330  4629 I am_kill : [0,16827,com.android.settings,0,crash,299636]

06-07 17:04:39.962  1330  4486 I am_crash:

[16962,0,com.android.settings,684441157,java.lang.IllegalArgumentException,Receiver not registered: com.android.settings.network.apn.ApnSettings$2@8e70e11,LoadedApk.java,1695,0]

06-07 17:04:39.966  1330  4486 I wm_finish_activity: [0,144324454,11,com.android.settings/.SubSettings,force-crash]

为什么一直找不到 Preference呢?(PreferenceControllerListHelper的报错 )

06-07 17:04:18.049 16962 16962 D PrefCtrlListHelper: Could not find Context-only controller for pref: com.android.settings.network.telephony.ApnPreferenceController

报错代码

ApnSettings

  1. 在onCreate和ResumeResume上都注册了
  2. 在Pause的时候取消注册,
  3. Destroy的时候判空,非空则再次取消注册。

或许是没走onCreate,但是Resume一定走的,那么就是Destroy的时候,为什么receiver非空,因为取消注册的时候是不会置为空的?

package com.android.settings.network.apn;

public class ApnSettings extends RestrictedSettingsFragment
        implements Preference.OnPreferenceChangeListener {


    //(全局变量)接收器
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //注册状态改变或飞行模式
            if (intent.getAction().equals(
                    TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED)) {
                fillList();//刷新APN界面
            } else if (intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {

    
        }
    };


    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        final Activity activity = getActivity();
        mSubId = activity.getIntent().getIntExtra(SUB_ID,
                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
        mPhoneId = SubscriptionUtil.getPhoneId(activity, mSubId);
        mIntentFilter = new IntentFilter(
                TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
        mIntentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        getActivity().registerReceiver(mReceiver, mIntentFilter);//已经注册了
    }

    @Override
    public void onResume() {
        super.onResume();
        getActivity().registerReceiver(mReceiver, mIntentFilter,
                Context.RECEIVER_EXPORTED_UNAUDITED);
    }

    @Override
    public void onPause() {
        super.onPause();
        getActivity().unregisterReceiver(mReceiver);
    }


    @Override
    public void onDestroy() {
        super.onDestroy();

        if (mReceiver != null) {
            getActivity().unregisterReceiver(mReceiver);//报错receiiver没有注册
        }
    }

ApnPreferenceController

都没执行创建的过程

PreferenceControllerListHelper 

package com.android.settings.core;

/**
 * Helper to load {@link BasePreferenceController} lists from Xml.
 */
public class PreferenceControllerListHelper {

    private static final String TAG = "PrefCtrlListHelper";

    /**
     * Instantiates a list of controller based on xml definition.
     */
    @NonNull
    public static List<BasePreferenceController> getPreferenceControllersFromXml(Context context,
            @XmlRes int xmlResId) {
        final List<BasePreferenceController> controllers = new ArrayList<>();
        List<Bundle> preferenceMetadata;
        try {
            preferenceMetadata = PreferenceXmlParserUtils.extractMetadata(context, xmlResId,
                    MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER
                            | MetadataFlag.FLAG_INCLUDE_PREF_SCREEN  | MetadataFlag.FLAG_FOR_WORK);
        } catch (IOException | XmlPullParserException e) {
            Log.e(TAG, "Failed to parse preference xml for getting controllers", e);
            return controllers;
        }

        for (Bundle metadata : preferenceMetadata) {
            final String controllerName = metadata.getString(METADATA_CONTROLLER);
            if (TextUtils.isEmpty(controllerName)) {
                continue;
            }
            BasePreferenceController controller;
            try {
                controller = BasePreferenceController.createInstance(context, controllerName);
            } catch (IllegalStateException e) {
                Log.d(TAG, "Could not find Context-only controller for pref: " + controllerName);
                final String key = metadata.getString(METADATA_KEY);
                final boolean isWorkProfile = metadata.getBoolean(METADATA_FOR_WORK, false);
                if (TextUtils.isEmpty(key)) {
                    Log.w(TAG, "Controller requires key but it's not defined in xml: "
                            + controllerName);
                    continue;
                }
                try {
                    controller = BasePreferenceController.createInstance(context, controllerName,
                            key, isWorkProfile);
                } catch (IllegalStateException e2) {
                    Log.w(TAG, "Cannot instantiate controller from reflection: " + controllerName);
                    continue;
                }
            }
            controllers.add(controller);
        }
        return controllers;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值