SIM卡设置默认短信流程分析(数据流量和电话设置相似)

来源:互联网 发布:尚书文字识别软件 编辑:程序博客网 时间:2024/04/30 11:41

工具显示sim卡设置页面对应的类是Setting$SimSettingActivity

实际上在Setting类中只有一行声明

public static classSimSettingsActivity 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()):

finalTelephonyManager tm=(TelephonyManager)getActivity().getSystemService

(Context.TELEPHONY_SERVICE);

addPreferencesFromResource(R.xml.sim_settings);

 

mNumSlots=tm.getSimCount();

mSimCards=(PreferenceScreen)findPreference(SIM_CARD_CATEGORY);

mAvailableSubInfos=newArrayList<SubscriptionInfo>(mNumSlots);

mSelectableSubInfos=newArrayList<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){

                   SubscriptionInfosir=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 booleanonPreferenceTreeClick(final Preference preference){

         final Context context=mContext;

         Intent intent=newIntent(context,SimDialogActivity.class);

         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);

 

         if(preference instanceofSimPreference){

                   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 SubscriptionInfosir=subInfoList.get(i);

         smsSubInfoList.add(sir);

         CharSequencedisplayName=sir.getDisplayName();

         if(displayName=null){

                   displayName=””;

         }

         list.add(displayName.toString()):

}

 

Dialog点击事件的监听

finalDialogInterface.OnClickListener selectionListener=

         new DialogInterface.OnClickListener(){

                   public voidonClick(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 SubscriptionManagersubscriptionManager=SubscriptionManager.from(context);

         subscriptionManager.setDefaultSmsSubId(subId);//设置默认Sim卡的源码操作

}


private voidsetDefaultDataSubId(final Context context,final int subId){

         final SubscriptionManagersubscriptionManager=SubscriptionManager.from(context);

         mSimManagementExt.setDataState(subId);

         TelephonyManagertelephonyManager=TelephonyManager.from(context);

         booleanenableBefore=telephonyManager.getDataEnabled();//获取当前数据连接状态

         intpreSubId=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

                   }

         }

}


原创粉丝点击