您的位置:首页 > 移动开发 > Android开发

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

2015-09-30 13:52 399 查看
现在根据项目需求,要在设置中添加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);

                }

            }

        }

    }

以上就是大致过程,小细节就没细述了,假日愉快。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: