现在根据项目需求,要在设置中添加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);
}
}
}
}
以上就是大致过程,小细节就没细述了,假日愉快。