功能简介
MobileNetwork移动网络设置页面下有【接入点设置】(APN)。
问题:为什么Controller初始化找不到pref,然后报错。
Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。
流程逻辑
1、界面“telephony_apn_key” 绑定 “ApnPreferenceController”
<com.android.settingslib.RestrictedPreference
android: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渲染使用。
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="mobile_network_pref_screen">
<PreferenceCategory
android: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.RestrictedPreference
android: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 implements
MobileNetworkRepository.MobileNetworkCallback {
private static final String LOG_TAG = "NetworkSettings";
//界面创建时候初始化各菜单的控制器
@Override
public void onAttach(Context context) {
super.onAttach(context);
use(ApnPreferenceControll