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
}
}
}
- SIM卡设置默认短信流程分析(数据流量和电话设置相似)
- (M)SIM卡开机流程分析之默认APN设置
- 短信ui--短信设置界面之sim卡短信管理
- 开机设置卡1为发送短信的默认sim卡
- android 4.4 设置默认短信 和来电短信拒接
- android 4.4 设置默认短信 和来电短信拒接
- android 4.4 设置默认短信 和来电短信拒接
- android 4.4 设置默认短信 和来电短信拒接
- 设置数据流量
- 小米手机因为默认权限设置电话拨号,短信等广播无法使用的解决办法
- ios 用application打开电话,短信,设置
- (M)SIM卡开机流程分析之主线分析
- mt2503如何使用自己设置的SC而非sim卡上的SC发送短信
- sim卡数据交互流程数据
- (M)SIM卡开机流程分析之SPN加载
- 短信ui分析--设置界面
- 设置为默认短信应用四个步骤
- 设置模块流程分析
- CNN结构:色彩空间建模-色彩空间分析
- UGUI开发细节
- 【数据库-MySql】按时间间隔分组查询 group by count(*) date_format
- linux的基本操作
- eclipse默认指向WebContent目录修改为webRoot 设置说明
- SIM卡设置默认短信流程分析(数据流量和电话设置相似)
- python---word表格样式设置
- git
- 【LeetCode】557. Reverse Words in a String III
- 初识IKAnalysis与Lucene
- html5知识点:超文本标记语言编程
- java导出excel表格
- springboot + mybatis +junit 测试用例编写
- 51nod 1460 连接小岛 贪心+multiset的用法