Android 10 设置没有sim状态栏图标

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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值