1. 示例
开门见山:无SIM卡图标设置实例
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
//添加内容示例
StatusBarIconController mIconController; //在源码里已经初始化
public void setNoSims(boolean show, boolean simDetected) {
if (!simDetected) {
mIconController.setIcon(mSlotMobile, R.drawable.no_sim, "没有SIM卡");
}
mIconController.setIconVisibility(mSlotMobile, show);
}
下面是分析,感兴趣可以看看
2. 分析
NetworkControllerImpl里注册了ACTION_SIM_STATE_CHANGED广播
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
// broadcasts
private void registerListeners() {
......
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
filter.addAction(TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED);
filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(ConnectivityManager.INET_CONDITION_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
filter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
mContext.registerReceiver(this, filter, null, mReceiverHandler);
mListening = true;
updateMobileControllers();
}
onReceive接受广播
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
switch (action){
......
case TelephonyIntents.ACTION_SIM_STATE_CHANGED:
// Avoid rebroadcast because SysUI is direct boot aware.
if (intent.getBooleanExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, false)) {
break;
}
// Might have different subscriptions now.
updateMobileControllers(); //这
break;
......
}
updateMobileControllers()
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
private void updateMobileControllers() {
if (!mListening) {
return;
}
doUpdateMobileControllers();
}
void doUpdateMobileControllers() {
......
updateNoSims();
}
protected void updateNoSims() {
boolean hasNoSubs = mHasMobileDataFeature && mMobileSignalControllers.size() == 0;
boolean simDetected = hasAnySim();
if (hasNoSubs != mHasNoSubs || simDetected != mSimDetected) {
mHasNoSubs = hasNoSubs;
mSimDetected = simDetected;
mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected);
}
}
mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected);
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
public void setNoSims(boolean show, boolean simDetected) {
obtainMessage(MSG_NO_SIM_VISIBLE_CHANGED, show ? 1 : 0, simDetected ? 1 : 0).sendToTarget();
}
handleMessage:
case MSG_NO_SIM_VISIBLE_CHANGED:
for (SignalCallback signalCluster : mSignalCallbacks) {
signalCluster.setNoSims(msg.arg1 != 0, msg.arg2 != 0);
}
break;
如果想设置没有SIM卡的状态栏图标可以在这里添加内容
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
//show:是否显示nosim图标
//simDetected:是否检测到sim卡
public void setNoSims(boolean show, boolean simDetected) {
// Noop yay!
}
//添加内容示例
StatusBarIconController mIconController;
public void setNoSims(boolean show, boolean simDetected) {
if (!simDetected) {
mIconController.setIcon(mSlotMobile, R.drawable.no_sim, "没有SIM卡");
}
mIconController.setIconVisibility(mSlotMobile, show);
}