一、背景
存在运营商需求:当SIM卡设置中选择了自动搜网,那么在重启开机后要执行一次手动搜网。
若基于本身单卡的实现,只搜索卡槽0的,而且写成了单线程,那么就在适配双卡的过程中还需要调整设计模式。
二、源码逻辑
- Settings应用发送消息,Telephony 模块Handler回调方法
- TeleService 处理消息 EVENT_GET_NETWORK_SELECTION_MODE_DONE,并notifyRequester()
- TelephonyManager => MD
(一)Settings APP
packages/apps/Settings/src/com/android/settings/network/ 界面
(二)Telephony Service
packages/services/Telephony/src/com/android/phone/PhoneInterfaceManager.java 业务逻辑
- handleMessage -> notifyRequester
/**
* A handler that processes messages on the main thread in the phone process. Since many
* of the Phone calls are not thread safe this is needed to shuttle the requests from the
* inbound binder threads to the main thread in the phone process. The Binder thread
* may provide a {@link MainThreadRequest} object in the msg.obj field that they are waiting
* on, which will be notified when the operation completes and will contain the result of the
* request.
*
* <p>If a MainThreadRequest object is provided in the msg.obj field,
* note that request.result must be set to something non-null for the calling thread to
* unblock.
*/
private final class MainThreadHandler extends Handler {
@Override
public void handleMessage(Message msg) {
MainThreadRequest request;
Message onCompleted;
AsyncResult ar;
UiccPort uiccPort;
IccAPDUArgument iccArgument;
final Phone defaultPhone = getDefaultPhone();
switch (msg.what) {
case EVENT_GET_NETWORK_SELECTION_MODE_DONE:
//obj参数保存了一个AsyncResult对象
ar = (AsyncResult) msg.obj;
//userObj参数保存了一个MainThreadRequest对象
request = (MainThreadRequest) ar.userObj;
if (ar.exception != null) { //异步请求异常,设置结果unknown
request.result = TelephonyManager.NETWORK_SELECTION_MODE_UNKNOWN;
} else { //根据异步请求结果设置网络选择模式
int mode = ((int[]) ar.result)[0];
if (mode == 0) { //mode0自动搜网
request.result = TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
} else { //mode1手动搜网
request.result = TelephonyManager.NETWORK_SELECTION_MODE_MANUAL;
}
}
notifyRequester(request); //通知请求异步操作的结果
break;
default:
Log.w(LOG_TAG, "MainThreadH