功能简介
MobileNetwork移动网络设置页面下有【接入点设置】(APN)。
问题:为什么Controller初始化找不到pref,然后报错。
Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。
流程逻辑
1、界面“telephony_apn_key” 绑定 “ApnPreferenceController”
<com.android.settingslib.RestrictedPreferenceandroid:key="telephony_apn_key"android:persistent="false"android:title="@string/mobile_network_apn_title"settings:allowDividerAbove="true"settings:keywords="@string/keywords_access_point_names"settings:controller="com.android.settings.network.telephony.ApnPreferenceController"/>
2、加载UI时,“MobileNetworkSettings” -- onAttach -- use(Controller).init(subId)
use(ApnPreferenceController.class).init(mSubId);
就是此处异常,无法创建ApnPreferenceController对象实例。
Note:use是什么逻辑?
关于界面刷新
MobileNetworkSettings类控制着移动网络设置的各个菜单显示逻辑,
onAvailableSubInfoChanged -- MobileNetworkRepository的回调
onSubscriptionDetailChanged -- 更新标题并刷新控件
redrawPreferenceControllers -- 开线程,在主线程更新UI,由父类实现
通过 ThreadUtils.postOnMainThread() 保证在主线程刷新界面,redrawPreferenceControllers 重新绘制/更新屏幕上的菜单控件。
ThreadUtils.postOnMainThread(() -> {renameTitle.accept(getActivity());redrawPreferenceControllers();
});
代码详情
业务代码
mobile_network_settings 布局
packages/apps/Settings/res/xml/mobile_network_settings.xml
定义移动网络界面的菜单控件,以供MobileNetwork渲染使用。
<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"xmlns:settings="http://schemas.android.com/apk/res-auto"android:key="mobile_network_pref_screen"><PreferenceCategoryandroid:key="enabled_state_container"android:title="@string/summary_placeholder"settings:controller="com.android.settings.network.telephony.DisabledSubscriptionController"android:layout="@layout/preference_category_no_label"><!--We want separate APN setting from reset of settings because we want user to change it with caution--><com.android.settingslib.RestrictedPreferenceandroid:key="telephony_apn_key"android:persistent="false"android:title="@string/mobile_network_apn_title"settings:allowDividerAbove="true"settings:keywords="@string/keywords_access_point_names"settings:controller="com.android.settings.network.telephony.ApnPreferenceController"/></PreferenceCategory></PreferenceScreen>
MobileNetworkSettings 界面加载
packages/apps/Settings/src/com/android/settings/network/telephony/MobileNetworkSettings.java
加载界面菜单控件,并响应多种信息回调更新界面,如注册状态变化时,显示或隐藏某些功能菜单。
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class MobileNetworkSettings extends AbstractMobileNetworkSettings implementsMobileNetworkRepository.MobileNetworkCallback {private static final String LOG_TAG = "NetworkSettings";//界面创建时候初始化各菜单的控制器@Overridepublic void onAttach(Context context) {super.onAttach(context);use(ApnPreferenceControll