工具显示sim卡设置页面对应的类是Setting$SimSettingActivity
实际上在Setting类中只有一行声明
public static class SimSettingsActivity extends SettingsActivity{/* empty */}
到AndroidManifest.xml中去找Setting$SimSettingActivity的注册声明,观察有下
<meta-dataandroid:name=”com.android.settings.FRAGMENT_CLASS”
android:value=”com.android.settings.sim.SimSettings”/>
于是发现这个类的具体实现类是SimSettings这个类
onCreate初始化一些变量
mContext=getActivity();
mSubscriptionManager=SubscriptionManager.from(getActivity()):
final TelephonyManager tm=(TelephonyManager)getActivity().getSystemService
(Context.TELEPHONY_SERVICE);
addPreferencesFromResource(R.xml.sim_settings);
mNumSlots=tm.getSimCount();
mSimCards=(PreferenceScreen)findPreference(SIM_CARD_CATEGORY);
mAvailableSubInfos=new ArrayList<SubscriptionInfo>(mNumSlots);
mSelectableSubInfos=new ArrayList<SubscriptionInfo>();
调用方法initForSimStateChange();
使用了aidl来实现跨进程通信,注册sim卡热插拔事件处理
注册广播getActivity().registerReceiver(mReceiver,intentFilter);
看一下mReceiver的定义,收到广播后会相继调用updateActivitesCategory();
updateCellularDataValues();updateCallvalues();updateSmsValues();
以更新短信为例,看updateSmsValues()方法,该方法更新短信条目显示
private void updateSmsValues(){
final Preference simPref=findPreference(KEY_SMS);
if(simPref!=null){
SubscriptionInfo sir=mSubscriptionManager.getDefaultSmsSubscriptionInfo();
simPref.setTitle(R.string.sms_messages_title);
sir=mSimManagementExt.setDefaultSubId(getActivity(),sir,KEY_SMS);//二次加工
if(sir!=null){
simPref.setSummary(sir.getDisplayName());
}else if(sir==null){
simPref.setSummary(R.string.sim_calls_ask_first_prefs_title);
mSimManagementExt.updateDefaultSmsSummary(simPref);
}
boolean enabled=sir==null?mSelectableSubInfos.size()>=1:mSelectableSubInfos.size()>1;
simPref.setEnabled(enabled);
}
}
然后看点击事件的处理流程
public boolean onPreferenceTreeClick(final Preference preference){
final Context context=mContext;
Intent intent=new Intent(context,SimDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);
if(preference instanceof SimPreference){
Intent newIntent=newIntent(context,SimPreferenceDialog.class);
newIntent.putExtra(EXTRA_SLOT_ID,((SimPreference)preference).getSlotId());
startActivity(newIntent);
}elseif(findPreference(KEY_CELLULAR_DATA)==preference){
intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY,SimDialogActivity.DATA_PICK);
context.startActivity(intent);
}else if(findPreference(KEY_SMS)==preference){
intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY,SimDialogActivity.SMS_PICK);
context.startActivity(intent);
}……
}
点击后intent将会携带type信息启动SimDialogActivity类
获取intent携带的type信息,会进入case SMS_PICK:中,
调用方法createDialog(this,dialogType); createDialog中的内容比较多,包括Dialog的生成,屏幕点击事件的监听,按键事件的监听等
当id==SMS_PICK时,调用方法setupSmsSubInfoList(list,subInfoList,selectableSubInfoLength,smsSubInfoList);
主要内容如下,维护一个String List和一个SubscriptionInfo List。
for(inti=0;i<selectableSubInfoLength;++i){
final SubscriptionInfo sir=subInfoList.get(i);
smsSubInfoList.add(sir);
CharSequence displayName=sir.getDisplayName();
if(displayName=null){
displayName=””;
}
list.add(displayName.toString()):
}
Dialog点击事件的监听
final DialogInterface.OnClickListener selectionListener=
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int value){
……
case DATA_PICK:
……
setDefaultDataSubId(context,targetSub);
……
case SMS_PICK:
intsubId=getPickSmsDefaultSub(subInfoList,value);//这里获取点击的id
setDefaultSmsSubId(context,subId);//设置默认sim卡的核心方法
……
}
}
private static void setDefaultSmsSubId(final Context context,final int subId){
final SubscriptionManager subscriptionManager=SubscriptionManager.from(context);
subscriptionManager.setDefaultSmsSubId(subId);//设置默认Sim卡的源码操作
}
private void setDefaultDataSubId(final Context context,final int subId){
final SubscriptionManager subscriptionManager=SubscriptionManager.from(context);
mSimManagementExt.setDataState(subId);
TelephonyManager telephonyManager=TelephonyManager.from(context);
boolean enableBefore=telephonyManager.getDataEnabled();//获取当前数据连接状态
int preSubId=telephonyManager.getDefaultDataSubscriptionId();//得到默认使用数据连接的sim卡id
if(subscriptionManager.isValidSubscriptionId(subId)&& subId!=preSubId){
subscriptionManager.setDefaultDataSubId(subId);
if(enableBefore){
telephonyManager.setDataEnabled(subId,true);//使能当前的SubscriptionId
telephonyManager.setDataEnabled(preSubId,false);//不使能之前的SubscriptionId
}
}
}