android 系统数据业务---打开/关闭概述
2017-07-17 19:03
501 查看
数据业务的打开/关闭
一般的app都可以实现数据业务的打开和关闭,例如手机里面的设置,数据业务的打开和关闭都是通过TelephonyManager接口来实现,具体的代码如下,
设置默认卡的打开和关闭,
public void setDataEnabled(boolean enable) { setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable); }
设置卡一或者卡二的打开/关闭,
public void setDataEnabled(int subId, boolean enable) { try { Log.d(TAG, "setDataEnabled: enabled=" + enable); getITelephony().setDataEnabled(subId, enable); } catch (RemoteException e) { Log.e(TAG, "Error calling ITelephony#setDataEnabled", e); } }
下面是获取卡的状态,打开/关闭,
public boolean getDataEnabled() { return getDataEnabled(SubscriptionManager.getDefaultDataSubId()); }
public boolean getDataEnabled(int subId) { boolean retVal = false; try { retVal = getITelephony().getDataEnabled(subId); } catch (RemoteException e) { Log.e(TAG, "Error calling ITelephony#getDataEnabled", e); } catch (NullPointerException e) { } Log.d(TAG, "getDataEnabled: retVal=" + retVal); return retVal; }
首先调用getITelephony方法获取服务端对象,然后调用对应的方法, getITelephony方法如下,
private ITelephony getITelephony() { return ITelephony.Stub.asInterface( ServiceManager.getService(Context.TELEPHONY_SERVICE)); }
获取的是PhoneInterfaceManager对象,
TelephonyManager和PhoneInterfaceManager分别是binder机制的两端, TelephonyManager是客户端,
PhoneInterfaceManager是服务端,运行于phone进程中,
PhoneInterfaceManager定义如下,
public class PhoneInterfaceManager extends ITelephony.Stub {
PhoneInterfaceManager的setDataEnabled方法调用流程图如下,
setDataEnabled方法的逻辑如下,
public void setDataEnabled(int subId, boolean enable) { enforceModifyPermission();//检查权限 int phoneId = mSubscriptionController.getPhoneId(subId);//获取phone id Phone phone = PhoneFactory.getPhone(phoneId);//获取phone对象 if (phone != null) { phone.setDataEnabled(enable);//调用setDataEnabled方法 } else { } }
获取的phone一般为GSMPhone或者CDMAPhone对象,以GSMPhone为例来论述,
GSMPhone的setDataEnabled方法如下,
public void setDataEnabled(boolean enable) { mDcTracker.setDataEnabled(enable); }
调用DcTracker的setDataEnabled方法,在其父类DcTrackerBase中实现,
public void setDataEnabled(boolean enable) { Message msg = obtainMessage(DctConstants.CMD_SET_USER_DATA_ENABLE); msg.arg1 = enable ? 1 : 0; if (DBG) log("setDataEnabled: sendMessage: enable=" + enable); sendMessage(msg); }
这里发送消息,主要是切换到主线程中执行,
DcTrackerBase对CMD_SET_USER_DATA_ENABLE消息处理如下,
case DctConstants.CMD_SET_USER_DATA_ENABLE: { final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false; if (DBG) log("CMD_SET_USER_DATA_ENABLE enabled=" + enabled); onSetUserDataEnabled(enabled); break; }
onSetUserDataEnabled方法主要逻辑如下,
1,和上次的phone状态对比,
if (mUserDataEnabled != enabled) { mUserDataEnabled = enabled;
如果和上次的状态一样,就没有必要进行更进一步的操作,然后保存这次的状态.
2,将状态值保存到数据库,
if (TelephonyManager.getDefault().getSimCount() == 1) { Settings.Global.putInt(mResolver, Settings.Global.MOBILE_DATA, enabled ? 1 : 0); } else { int phoneSubId = mPhone.getSubId(); Settings.Global.putInt(mResolver, Settings.Global.MOBILE_DATA + phoneSubId, enabled ? 1 : 0); }
3,通知apn断开,
if (getDataOnRoamingEnabled() == false && mPhone.getServiceState().getDataRoaming() == true) { if (enabled) { notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON); } else { notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED); } }
4,打开/关闭 数据业务
if (enabled) { onTrySetupData(Phone.REASON_DATA_ENABLED); } else { onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED); }
分2部分进行论述,首先论述数据业务打开的详细流程,然后论述关闭的详细流程。
onTrySetupData和onTrySetupData方法都是在子类DcTracker中实现的。
相关文章推荐
- android 系统数据业务---打开
- android:打开系统联系人界面并获取数据
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
- Android打开/关闭数据流量
- Android(Java):得到新打开Activity 关闭后返回的数据
- Android如何打开/关闭系统解锁服务?—典型错误分析
- Android 系统默认关闭数据流量
- android 系统上做GC双模的---数据业务的处理分析
- Android如何快速打开系统软键盘和关闭系统软键盘
- android 系统上做GC双模的---数据业务的处理分析
- cocos android按home键后应用被系统关闭,再次打开后分辨率错误
- Android系统移植与调试之------->增加一个双击物理按键打开和关闭闪光灯并将闪光灯状态同步到下拉菜单中
- android 之得到新打开Activity 关闭后返回的数据
- android开发之使用startActivityForResut获得打开的新窗体关闭后返回的数据
- Android:打开系统联系人界面并获取数据
- [Android] 监听系统网络连接打开或者关闭的消息
- android 将数据以文件的形式保存进sd卡并调用系统所装软件打开
- Android 通过反射打开与关闭数据连接