android 5.1 中添加显示运营商的控制

本文介绍如何在Android系统中实现运营商名称显示的开关功能。通过在设置应用中添加Switch控件,用户可以自由选择是否显示运营商名称。文章详细描述了从设置模块到SystemUI的实现流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在根据项目需求,要在设置中添加switch来控制是否显示运营商。我的过程如下所示:

首先在设置的显示中添加控制:

packages/apps/Settings./res/xml/display_settings.xml

 <SwitchPreference
                android:key="carrier_show_hide"
                android:title="@string/carrier_show_hide"
                android:persistent="false" />
/packages/apps/Settings/src/com/android/settings/DisplaySettings.java

 private static final String KEY_CARRIER="carrier_show_hide";

 public void onCreate(Bundle savedInstanceState) {
 mCarrierShowPreference = (SwitchPreference) findPreference(KEY_CARRIER);
        mCarrierShowPreference.setOnPreferenceChangeListener(this);
}
<span style="font-size:18px;color:#3333FF;"> <span style="font-size:18px;">进入设置时初始化当前的设置状态。</span></span>
if(mCarrierShowPreference != null) {
            SharedPreferences sharedPreferences = getActivity().getSharedPreferences("carrierShow_setting",getActivity().MODE_WORLD_WRITEABLE); 
            int show=sharedPreferences.getInt("show",0);
            if(show==1) {
                boolean show_or_hide=true;
                mCarrierShowPreference.setChecked(show_or_hide);
                Editor editor = sharedPreferences.edit();
                editor.putInt("show", 1);
                editor.commit();
            } else {
                boolean show_or_hide=false;
                mCarrierShowPreference.setChecked(show_or_hide);
                Editor editor = sharedPreferences.edit();
                editor.putInt("show", 0);
                editor.commit();
            }
        }

当设置中切换状态时,保存当前的状态到sharepreferences中。并发送广播给Systemui去进行更新。

if (preference == mCarrierShowPreference) {
            boolean show= (Boolean) objValue;
            SharedPreferences sharedPreferences = getActivity().getSharedPreferences("carrierShow_setting",getActivity().MODE_WORLD_WRITEABLE);
            if(show) {
                Editor editor = sharedPreferences.edit();
                editor.putInt("show", 1);
                editor.commit();
            } else {
                Editor editor = sharedPreferences.edit();
                editor.putInt("show", 0);
                editor.commit();
            }        
            Intent mIntent = new Intent();
	        mIntent.setAction("CARRIER_SHOW_OR_HIDE");
            mIntent.putExtra("show_or_hide", show);
	        getActivity().sendBroadcast(mIntent);     
        }

接下来就是再SystemUI中进行处理

/home/blandon/android/trunk/frameworks/base/packages/SystemUI/res/layout/status_bar.xml

 <com.android.keyguard.AlphaOptimizedLinearLayout
                android:id="@+id/notification_icon_area_inner"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                >
               <!-- add by zhouming for carrier show or hide -->
               <TextView
                   android:id="@+id/carrier_text"
                   android:layout_width="wrap_content"
                   android:layout_height="match_parent"
                   android:gravity="center"
                   android:text="@string/device_info_not_available"
                   />

这里得注意,5.1中的Systemui的布局中,如果添加在com.android.systemui.statusbar.AlphaOptimizedFrameLayout外面,会随着锁屏界面的打开而消失,具体就是再PhoneStatusBar中控制,这里不多说。


/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

 private MyBroadcastReceiver mCarrierBroadcastReceiver;
mCarrierBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("CARRIER_SHOW_OR_HIDE");
        context.registerReceiver(mCarrierBroadcastReceiver, intentFilter);

该广播用来接受从设置端传来的控制参数

public class MyBroadcastReceiver extends BroadcastReceiver {
  
        @Override
        public void onReceive(Context context, Intent intent) {
           
            boolean show=intent.getBooleanExtra("show_or_hide", false);
            if(show) {
              mCarrierText.setVisibility(View.VISIBLE);
              mCarrierText.setText(carrier_text);
              SharedPreferences sharedPreferences = context.getSharedPreferences("carrierShow", context.MODE_WORLD_WRITEABLE); 
              Editor editor = sharedPreferences.edit();
              editor.putInt("show", 1);
              editor.commit();
            }else{
             // mCarrierText.setText(carrier_text);
              mCarrierText.setVisibility(View.GONE);
              SharedPreferences sharedPreferences = context.getSharedPreferences("carrierShow", context.MODE_WORLD_WRITEABLE); 
              Editor editor = sharedPreferences.edit();
              editor.putInt("show", 0);
              editor.commit();
            }
       }
    }
同时得注册对ServiceState改变的监听

系统中的ServiceState改变会发送ACTION_SERVICE_STATE_CHANGED的广播,并且该广播是Stiky广播,所以当我们注册时便能收到改变。

MyPhoneStateReceiver myreceiver = new MyPhoneStateReceiver();
        IntentFilter mintentFilter = new IntentFilter(ACTION_SERVICE_STATE_CHANGED);
        context.registerReceiver(myreceiver, mintentFilter);

 private class MyPhoneStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_SERVICE_STATE_CHANGED)) {
                Log.d(TAG, "Intent Action: ACTION_SERVICE_STATE_CHANGED");
                ServiceState mServiceState =  ServiceState.newFromBundle(intent.getExtras());
                //switch (mServiceState.getState()) {
                switch(intent.getExtras().getInt("state")){
                    case 0:
                       // mStringSer = "IN_SERVICE ";
                        break;
                    case 1:
                       // mStringSer = "OUT_OF_SERVICE";
                        break;
                    case 2:
                      //  mStringSer = "EMERGENCY_ONLY";
                        break;
                    case 3:
                      //  mStringSer = "POWER_OFF";
                        break;
                    default:
                     //   mStringSer = "UNKNOWN";
                        break;
                }
                carrier_text=mServiceState.getOperatorAlphaLong();
                if(carrier_text==null) {
                   carrier_text="No Service";
                }
                SharedPreferences sharedPreferences = context.getSharedPreferences("carrierShow", context.MODE_WORLD_WRITEABLE);
                int showOrHide = sharedPreferences.getInt("show", 0);
                if(showOrHide==1) {
                    mCarrierText.setText(carrier_text);
                }

            }
        }
    }



以上就是大致过程,小细节就没细述了,假日愉快。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值