Android 系统APN配置详解
这些天一直在调系统原生的Settings.apk里面APN配置的问题,在设置里面手动增加了APN配置选项,但是在界面上还是看不到。所以跟了下代码,原以为就是简单的页面显示的问题,这一跟不要紧,一下就快追到HAL层去了(NND).
首先看Settings.apk的源码,位于packages/apps/Settings/src/com/android/settings/目录下:首先找到ApnSettings类,继承于PreferenceActivity,并实现了Preference.OnPreferenceChangeListener接口。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity,这里就不再赘述了。
public class ApnSettings extends PreferenceActivity implements
Preference.OnPreferenceChangeListener {
// 恢复出厂设置的URI
public static final String RESTORE_CARRIERS_URI = "content://telephony/carriers/restore";
// 普通URI,用于ContentPrivoder保存着APN配置信息
public static final String PREFERRED_APN_URI = "content://telephony/carriers/preferapn";
private static final Uri DEFAULTAPN_URI = Uri.parse(RESTORE_CARRIERS_URI);
private static final Uri PREFERAPN_URI = Uri.parse(PREFERRED_APN_URI);
// 两个句柄,用于恢复出厂设置
private RestoreApnUiHandler mRestoreApnUiHandler;
private RestoreApnProcessHandler mRestoreApnProcessHandler;
private String mSelectedKey;
// 组播接收的Intent过滤器
private IntentFilter mMobileStateFilter;
private final BroadcastReceiver mMobileStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
Phone.DataState state = getMobileDataState(intent);
switch (state) {
case CONNECTED:
if (!mRestoreDefaultApnMode) {
fillList();
} else {
showDialog(DIALOG_RESTORE_DEFAULTAPN);
}
break;
}
}
}
};
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
// 在activity创建的时候根据xml文件来配置视图,
// 实际上 res/xml/apn_settings.xml这个文件就是一个空的PreferenceScreen
addPreferencesFromResource(R.xml.apn_settings);
getListView().setItemsCanFocus(true); // 如果有List则获得焦点
// 这个创建一个Inter 过滤器,过滤的动作为 ACTION_ANY_DATA_CONNECTION_STATE_CHANGED
mMobileStateFilter = new IntentFilter(
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
}
@Override
protec