这几天不断研究Perference的知识,还是有些一知半解,这次写个文章记录一下,省的又忘了。
这边是通过设置菜单里面的选项启动一个app,忽略次要看主要
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:id="@+id/network_settings"
android:title="@string/network_title"
android:icon="@drawable/ic_settings_network">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.yeezone.netmix"
android:targetClass="com.yeezone.netmix.MainActivity" />
</header>
</preference-headers>
这样就可以启动一个app了,其中targetPackage是包名,targetClass是类名。
首先我们可以看一下启动Activity所使用的布局,很简单:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/network_title"
android:key="sound_settings"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
<SwitchPreference
android:key="s_mode_class_change"
android:title="@string/satellite"
android:summaryOn="@string/print_feature_state_on"
android:summaryOff="@string/print_feature_state_off"
/>
<SwitchPreference
android:key="specialized_class_change"
android:title="@string/specialized_LTE"
android:summaryOn="@string/print_feature_state_on"
android:summaryOff="@string/print_feature_state_off"
/>
<SwitchPreference
android:key="zzw_class_change"
android:title="@string/zzw"
android:summaryOn="@string/print_feature_state_on"
android:summaryOff="@string/print_feature_state_off"
/>
<SwitchPreference
android:key="wlanLTE_class_change"
android:title="@string/wlanLTE"
android:summaryOn="@string/print_feature_state_on"
android:summaryOff="@string/print_feature_state_off"
/>
<SwitchPreference
android:key="bluetooth_class_change"
android:title="@string/bluetooth"
android:summaryOn="@string/print_feature_state_on"
android:summaryOff="@string/print_feature_state_off"
/>
<ListPreference
android:dialogTitle="@string/test_ethernet_change"
android:entries="@array/test_ethernet_change"
android:entryValues="@array/test_ethernet_change_value"
android:key="key_mode_ethernet_style"
android:title="@string/test_ethernet_change"
android:defaultValue="@string/default_value" />
<ListPreference
android:dialogTitle="@string/ptt_set"
android:entries="@array/ModelChange"
android:entryValues="@array/ModelChange_value"
android:key="key_mode_ptt_style"
android:title="@string/ptt_set"
android:defaultValue="@string/default_value" />
<ListPreference
android:dialogTitle="@string/opt_set"
android:entries="@array/ModelChange"
android:entryValues="@array/ModelChange_value"
android:key="key_mode_opt_style"
android:title="@string/opt_set"
android:defaultValue="@string/default_value" />
</PreferenceScreen>
<string-array name="test_ethernet_change">
<item>@string/NetworkCardMode</item>
<item>@string/HotSpotPattern</item>
<item>@string/close</item>
</string-array>
<string-array name="test_ethernet_change_value">
<item>001</item>
<item>002</item>
<item>003</item>
</string-array>
private static final String KEY_MODE_ETHERNET_STYLE = "key_mode_ethernet_style";
private ListPreference mEthernetPreference = null;
mEthernetPreference = (ListPreference)findPreference(KEY_MODE_ETHERNET_STYLE);
mEthernetPreference.setOnPreferenceChangeListener(this);
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == mEthernetPreference){
if(newValue.equals("001")){
mEthernetPreference.setSummary(getString(R.string.NetworkCardMode));
}else if(newValue.equals("002")){
mEthernetPreference.setSummary(getString(R.string.HotSpotPattern));
}else if(newValue.equals("003")){
mEthernetPreference.setSummary(getString(R.string.close));
}
}
下面是关于SwitchPerference,这个开关控件很特殊,他会跑2遍程序,用起来没有别的顺手,网上参考的代码可以让他只走一遍,我希望只打开一个,否则会有弹出框做出提示。
final String key = preference.getKey();
boolean isCheckedSmode = mSmodePreference.isChecked();
boolean isCheckedSpecialized = mSpecializedPreference.isChecked();
boolean isCheckedZzw = mZzwPreference.isChecked();
boolean isCheckedWlan = mWlanPreference.isChecked();
boolean isCheckedBluetooth = mBluetoothPreference.isChecked();
if(SMODE_CLASS_CHANGE.equals(key)){
if (mSmodePreference.isChecked() != (Boolean)newValue) {
// wifiManager.setWifiEnabled(false);
// cm.setMobileDataEnabled(false);
if(!isCheckedSmode&&!isCheckedSpecialized&&!isCheckedZzw&&!isCheckedWlan&&!isCheckedBluetooth){
Intent intentSatellite = new Intent(MainActivity.this,SatelliteSet.class);
startActivity(intentSatellite);
SystemProperties.set("persist.sys.smode.one", "1");
}else if(isCheckedSmode){
Log.d(TAG, "isCheckedSmode");
SystemProperties.set("persist.sys.smode.one", "0");
}else{
dialogExit();
}
}
}
其中有关于如何控制WLAN和数据网开关的功能,代码如下:
private WifiManager wifiManager=null;
private ConnectivityManager cm;
wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
wifiManager.setWifiEnabled(false);
cm.setMobileDataEnabled(false);
其中有开关键同步,是通过广播来实现,代码如下:
这是第一个Activity中使用的代码,启动广播
SystemProperties.set("persist.sys.smode.two", "1");
Intent intent = new Intent();
intent.setAction("action.refreshList");
sendBroadcast(intent);
第二个Activity负责接收,代码如下:
oncreate中启动接收广播,做自己要做的事情。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("action.refreshList");
registerReceiver(mRefreshBroadcastReceiver, intentFilter);
// broadcast receiver
private BroadcastReceiver mRefreshBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("action.refreshList")) {
String valueSmode = SystemProperties.get("persist.sys.smode.two");
if("1".equals(valueSmode)){
mSmodePreference.setChecked(true);
}else{
mSmodePreference.setChecked(false);
}
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mRefreshBroadcastReceiver);
}
这边有一个点击button跳出单选并且会覆盖button原先的内容,其中也用到了Array,这里就不贴出来了:
private void dialog_work() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.work_modle);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setItems(R.array.entries_font_size, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ListView lw = ((AlertDialog) dialog).getListView();
Object checkedItem = lw.getAdapter().getItem(which);
Log.i(TAG, (String) checkedItem);
dialog.dismiss();
work_set.setText((String) checkedItem);
if (getString(R.string.normal_mode).equals((String) checkedItem)) {
Log.i(TAG, "action1:" + (String) checkedItem);
} else if (getString(R.string.emergency_mode).equals((String) checkedItem)) {
Log.i(TAG, "action2:" + (String) checkedItem);
} else if (getString(R.string.test_mode).equals((String) checkedItem)) {
Log.i(TAG, "action3:" + (String) checkedItem);
}
}
});
builder.setNegativeButton(R.string.quxiao, null);
AlertDialog dialog = builder.create();
dialog.show();
}
<string-array name="entries_font_size">
<item>@string/normal_mode</item>
<item>@string/emergency_mode</item>
<item>@string/test_mode</item>
</string-array>
完整代码如下:
package com.yeezone.netmix;
import android.app.AlertDialog;
import android.app.Dialog;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.media.AudioManager;
import android.media.RingtoneManager;
import android.media.audiofx.AudioEffect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.SystemProperties;
import android.os.Vibrator;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.Preference.OnPreferenceChangeListener;
import android.provider.MediaStore;
import android.provider.Settings;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.preference.PreferenceFragment;
import java.util.List;
import android.net.wifi.WifiManager;
import android.net.ConnectivityManager;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
private final String TAG = "MainActivity";
private static final String SMODE_CLASS_CHANGE = "s_mode_class_change";
private static final String SPECIALIZED_CLASS_CHANGE = "specialized_class_change";
private static final String ZZW_CLASS_CHANGE = "zzw_class_change";
private static final String WLANLTE_CLASS_CHANGE = "wlanLTE_class_change";
private static final String BLUETOOTH_CLASS_CHANGE = "bluetooth_class_change";
private static final String KEY_MODE_PTT_STYLE = "key_mode_ptt_style";
private static final String KEY_MODE_OPT_STYLE = "key_mode_opt_style";
private static final String KEY_MODE_ETHERNET_STYLE = "key_mode_ethernet_style";
private SwitchPreference mSmodePreference = null;
private SwitchPreference mSpecializedPreference = null;
private SwitchPreference mZzwPreference = null;
private SwitchPreference mWlanPreference = null;
private SwitchPreference mBluetoothPreference = null;
private ListPreference mPTTPreference = null;
private ListPreference mOPTPreference = null;
private ListPreference mEthernetPreference = null;
private WifiManager wifiManager=null;
private ConnectivityManager cm;
// private static boolean m7503Project;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// m7503Project = getResources().getBoolean(R.bool.config_show_m7503);
// if(m7503Project){
// addPreferencesFromResource(R.xml.network_settings_two);
// }else{
// addPreferencesFromResource(R.xml.network_settings);
// }
addPreferencesFromResource(R.layout.network_settings);
mSmodePreference = (SwitchPreference)findPreference(SMODE_CLASS_CHANGE);
mSpecializedPreference = (SwitchPreference)findPreference(SPECIALIZED_CLASS_CHANGE);
mZzwPreference = (SwitchPreference)findPreference(ZZW_CLASS_CHANGE);
mWlanPreference = (SwitchPreference)findPreference(WLANLTE_CLASS_CHANGE);
mBluetoothPreference = (SwitchPreference)findPreference(BLUETOOTH_CLASS_CHANGE);
mPTTPreference = (ListPreference)findPreference(KEY_MODE_PTT_STYLE);
mOPTPreference = (ListPreference)findPreference(KEY_MODE_OPT_STYLE);
mEthernetPreference = (ListPreference)findPreference(KEY_MODE_ETHERNET_STYLE);
wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
mSmodePreference.setOnPreferenceChangeListener(this);
mSpecializedPreference.setOnPreferenceChangeListener(this);
mZzwPreference.setOnPreferenceChangeListener(this);
mWlanPreference.setOnPreferenceChangeListener(this);
mBluetoothPreference.setOnPreferenceChangeListener(this);
mPTTPreference.setOnPreferenceChangeListener(this);
mOPTPreference.setOnPreferenceChangeListener(this);
mEthernetPreference.setOnPreferenceChangeListener(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("action.refreshList");
registerReceiver(mRefreshBroadcastReceiver, intentFilter);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.d(TAG, "onPreferenceChange");
final String key = preference.getKey();
boolean isCheckedSmode = mSmodePreference.isChecked();
boolean isCheckedSpecialized = mSpecializedPreference.isChecked();
boolean isCheckedZzw = mZzwPreference.isChecked();
boolean isCheckedWlan = mWlanPreference.isChecked();
boolean isCheckedBluetooth = mBluetoothPreference.isChecked();
if(SMODE_CLASS_CHANGE.equals(key)){
if (mSmodePreference.isChecked() != (Boolean)newValue) {
// wifiManager.setWifiEnabled(false);
// cm.setMobileDataEnabled(false);
if(!isCheckedSmode&&!isCheckedSpecialized&&!isCheckedZzw&&!isCheckedWlan&&!isCheckedBluetooth){
Intent intentSatellite = new Intent(MainActivity.this,SatelliteSet.class);
startActivity(intentSatellite);
SystemProperties.set("persist.sys.smode.one", "1");
}else if(isCheckedSmode){
Log.d(TAG, "isCheckedSmode");
SystemProperties.set("persist.sys.smode.one", "0");
// Intent intent = new Intent();
// intent.setAction("action.refreshmodel");
// sendBroadcast(intent);
}else{
dialogExit();
}
}
}else if(SPECIALIZED_CLASS_CHANGE.equals(key)){
if (mSpecializedPreference.isChecked() != (Boolean)newValue) {
}
}else if(ZZW_CLASS_CHANGE.equals(key)){
if (mZzwPreference.isChecked() != (Boolean)newValue) {
}
}else if(WLANLTE_CLASS_CHANGE.equals(key)){
if (mWlanPreference.isChecked() != (Boolean)newValue) {
}
}else if(BLUETOOTH_CLASS_CHANGE.equals(key)){
if (mBluetoothPreference.isChecked() != (Boolean)newValue) {
}
}else if (preference == mPTTPreference){
if(newValue.equals("001")){
mPTTPreference.setSummary(getString(R.string.lte_szdj));
}else if(newValue.equals("002")){
mPTTPreference.setSummary(getString(R.string.zzw_szdj));
}else if(newValue.equals("003")){
mPTTPreference.setSummary(getString(R.string.weixin_talk));
}else if(newValue.equals("004")){
mPTTPreference.setSummary(getString(R.string.close));
}
}else if (preference == mOPTPreference){
if(newValue.equals("001")){
mOPTPreference.setSummary(getString(R.string.lte_szdj));
}else if(newValue.equals("002")){
mOPTPreference.setSummary(getString(R.string.zzw_szdj));
}else if(newValue.equals("003")){
mOPTPreference.setSummary(getString(R.string.weixin_talk));
}else if(newValue.equals("004")){
mOPTPreference.setSummary(getString(R.string.close));
}
}else if (preference == mEthernetPreference){
if(newValue.equals("001")){
mEthernetPreference.setSummary(getString(R.string.NetworkCardMode));
}else if(newValue.equals("002")){
mEthernetPreference.setSummary(getString(R.string.HotSpotPattern));
}else if(newValue.equals("003")){
mEthernetPreference.setSummary(getString(R.string.close));
}
}
return true;
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference == mPTTPreference) {
}else if (preference == mOPTPreference) {
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
private void dialogExit(){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle(R.string.biaoti);
builder.setMessage(R.string.comfirm_restart);
// builder.setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() {
//
// @Override
// public void onClick(DialogInterface dialog, int which) {
//
// dialog.dismiss();
// }
// });
builder.setNegativeButton(R.string.quxiao, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mSmodePreference.setChecked(false);
dialog.dismiss();
}
});
builder.create().show();
}
void setFile(String path, String val) {
FileOutputStream out = null;
try {
out = new FileOutputStream(path);
byte[] buf = val.getBytes();
out.write(buf, 0, buf.length);
} catch (FileNotFoundException e) {
Log.e(TAG, "FileNotFoundException: setFile " + e);
} catch (IOException e) {
Log.e(TAG, "IOException: setFile " + e);
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
}
}
}
String getFile(String path) {
FileInputStream is = null;
String val = null;
try {
is = new FileInputStream(path);
byte[] buffer = new byte[64];
int count = is.read(buffer);
if (count > 0) {
val = new String(buffer, 0, count);
}
} catch (IOException e) {
Log.d(TAG, "IOException: getFile " + e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
if (val != null) {
val = val.trim();
}
return val;
}
// broadcast receiver
private BroadcastReceiver mRefreshBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("action.refreshList")) {
String valueSmode = SystemProperties.get("persist.sys.smode.two");
if("1".equals(valueSmode)){
mSmodePreference.setChecked(true);
}else{
mSmodePreference.setChecked(false);
}
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mRefreshBroadcastReceiver);
}
}
package com.yeezone.netmix;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.SystemProperties;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.Switch;
public class SatelliteSet extends Activity {
private static final String TAG = "SatelliteSet";
private Button work_set, text_set;
private Switch control;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.satellite_model_set);
work_set = (Button) findViewById(R.id.work_set);
text_set = (Button) findViewById(R.id.text_set);
control = (Switch) findViewById(R.id.control);
// IntentFilter intentFilter = new IntentFilter();
// intentFilter.addAction("action.refreshmodel");
// registerReceiver(mRefreshBroadcastReceiver, intentFilter);
String value = SystemProperties.get("persist.sys.smode.one");
Log.i(TAG, "value1:"+ value);
if("0".equals(value)){
control.setChecked(false);
}else{
control.setChecked(true);
}
work_set.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog_work();
}
});
text_set.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog_text();
}
});
control.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
SystemProperties.set("persist.sys.smode.two", "1");
Intent intent = new Intent();
intent.setAction("action.refreshList");
sendBroadcast(intent);
Log.i(TAG, "on1");
} else {
SystemProperties.set("persist.sys.smode.two", "0");
Intent intent = new Intent();
intent.setAction("action.refreshList");
sendBroadcast(intent);
Log.i(TAG, "off2");
}
}
});
}
private void dialog_work() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.work_modle);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setItems(R.array.entries_font_size, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ListView lw = ((AlertDialog) dialog).getListView();
Object checkedItem = lw.getAdapter().getItem(which);
Log.i(TAG, (String) checkedItem);
dialog.dismiss();
work_set.setText((String) checkedItem);
if (getString(R.string.normal_mode).equals((String) checkedItem)) {
Log.i(TAG, "action1:" + (String) checkedItem);
} else if (getString(R.string.emergency_mode).equals((String) checkedItem)) {
Log.i(TAG, "action2:" + (String) checkedItem);
} else if (getString(R.string.test_mode).equals((String) checkedItem)) {
Log.i(TAG, "action3:" + (String) checkedItem);
}
}
});
builder.setNegativeButton(R.string.quxiao, null);
AlertDialog dialog = builder.create();
dialog.show();
}
private void dialog_text() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.text_set);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setItems(R.array.text_change, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ListView lw = ((AlertDialog) dialog).getListView();
Object checkedItem = lw.getAdapter().getItem(which);
Log.i(TAG, (String) checkedItem);
dialog.dismiss();
text_set.setText((String) checkedItem);
if (getString(R.string.single_carrier_transmission).equals((String) checkedItem)) {
Log.i(TAG, "action11:" + (String) checkedItem);
} else if (getString(R.string.continuous_emission).equals((String) checkedItem)) {
Log.i(TAG, "action22:" + (String) checkedItem);
}
}
});
builder.setNegativeButton(R.string.quxiao, null);
AlertDialog dialog = builder.create();
dialog.show();
}
// // broadcast receiver
// private BroadcastReceiver mRefreshBroadcastReceiver = new BroadcastReceiver() {
//
// @Override
// public void onReceive(Context context, Intent intent) {
// Log.i(TAG, "BroadcastReceiver");
// String action = intent.getAction();
// if (action.equals("action.refreshmodel")) {
//
// String valueSmode = SystemProperties.get("persist.sys.smode.one");
// if("0".equals(valueSmode)){
// control.setChecked(false);
// }
// }
// }
// };
//
// @Override
// protected void onDestroy() {
// super.onDestroy();
// unregisterReceiver(mRefreshBroadcastReceiver);
// }
}