这篇主要是具体例子,可以先看一下理论,网址是:Android中Preference的使用以及监听事件分析
我们可以先看一下效果图
我们先截取不小段布局,代码如下:
<ListPreferenceandroid:defaultValue="@string/usb_default_value"android:dialogTitle="@string/test_USB_change"android:entries="@array/USBChange"android:entryValues="@array/USBChange_value"android:key="key_amt3_USB_change"android:title="@string/test_USB_change" ></ListPreference>
我们可以看见代码中引用到了string和array,也给出相应的代码,array相对重要些:
<string name="test_USB_change">USB 切换</string>
<string name="usb_default_value">001</string>
<string-array name="USBChange"><item>AP</item><item>CP</item><item>CP Update</item><item>@string/EncryptionCard</item></string-array><string-array name="USBChange_value"><item>001</item><item>002</item><item>003</item><item>004</item></string-array>
array由2块组成,下面为具体的java代码,本身为了记录,没有处理,很容易看懂
package com.leadcore.amt3;import java.util.List;import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemProperties;
import android.os.PowerManager;
import android.app.AlertDialog.Builder;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.widget.Toast;
import android.util.Log;
import com.android.internal.telephony.TelephonyIntents;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.preference.ListPreference;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileInputStream;/*** AMT3 main entry
*/
public class Amt3MainActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {/*** TAG*/private static final String TAG = "Amt3MainActivity";private static final String KEY_AMT3_CONTINUOUS_TEST = "key_amt3_continuous_test";private static final String KEY_AMT3_INDIVIDUAL_TEST = "key_amt3_individual_test";private static final String KEY_AMT3_TEST_RESULT = "key_amt3_test_result";private static final String KEY_AMT3_CUSTOM_CALIBRATION_STATION = "key_amt3_custom_calibration_station";private static final String KEY_AMT3_USB_AMT1 = "key_amt3_usb_amt1";private static final String KEY_AMT3_USB_ChANGE = "key_amt3_USB_change";private static final String KEY_AMT3_ROOT_ChANGE = "key_amt3_ROOT_change";private static final String KEY_AMT3_TEST_RESTART_CP = "key_amt3_test_restart_CP";private static final String STATUS = "amt.normal.amt.switch_status";public static final String PROPERTY_AMT3_MMI_STATION = "persist.sys.lc.amt.mmi.station";public static final String MMI_PASS = "MMI-PASS";public static final String MMI_FAIL = "MMI-FAIL";public static final String MMI_NO_TEST = "MMI-NO-TEST";/*** Initialize AMT Service failed.*/private static final int MSG_ID_MAIN_AMT3_INIT_FAILED = 1;private Preference mContinuousTest = null;private Preference mIndividualTest = null;private Preference mTestResult = null;private Preference mCalibration = null;private CheckBoxPreference mCheckBoxPreference = null;private ListPreference mUSBPreference = null;private ListPreference mROOTPreference = null;private Preference mRestartCP = null;/*** To receive message* MSG_ID_MAIN_AMT3_INIT_FAILED.*/private final Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {Log.v(TAG, "handleMessage msg.what = " + msg.what);if (msg.what == MSG_ID_MAIN_AMT3_INIT_FAILED) {mContinuousTest.setEnabled(false);mIndividualTest.setEnabled(false);mTestResult.setEnabled(false);mCalibration.setEnabled(false);mUSBPreference.setEnabled(false);mROOTPreference.setEnabled(false);mRestartCP.setEnabled(false);} else {Log.v(TAG, "handleMessage invalid message");}}};private boolean isKillProcess = false;public static Activity mActivity = null;private boolean mGpsEnabled;private WifiManager wifiManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.v(TAG, "onCreate");super.onCreate(savedInstanceState);int isFinish = getIntent().getIntExtra("finish", 0);boolean isHistory = ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0);Log.v(TAG, "onCreate isFinish = " + isFinish + " isHistory = " + isHistory);if (isHistory) {Log.v(TAG, "onCreate launch from history");int status = SystemProperties.getInt(STATUS, 0);Log.v(TAG, "onCreate status = " + status);if (1 == status) {Log.v(TAG, "onCreate in AMT MODE exit");Toast.makeText(Amt3MainActivity.this, R.string.amt_in_amt_mode_exit, Toast.LENGTH_SHORT).show();//isKillProcess = true;if (Amt3ChangeModeActivity.mActivity != null) {isKillProcess = true;}finish();//Intent intent = new Intent("android.action.amt3.start");//sendBroadcast(intent);return;}} else {if (isFinish == 1) {finish();return;}}addPreferencesFromResource(R.layout.amt3_main_activity);mContinuousTest = findPreference(KEY_AMT3_CONTINUOUS_TEST);mIndividualTest = findPreference(KEY_AMT3_INDIVIDUAL_TEST);mTestResult = findPreference(KEY_AMT3_TEST_RESULT);mCalibration = findPreference(KEY_AMT3_CUSTOM_CALIBRATION_STATION);mCheckBoxPreference = (CheckBoxPreference)findPreference(KEY_AMT3_USB_AMT1);mUSBPreference = (ListPreference)findPreference(KEY_AMT3_USB_ChANGE);mROOTPreference = (ListPreference)findPreference(KEY_AMT3_ROOT_ChANGE);mRestartCP = findPreference(KEY_AMT3_TEST_RESTART_CP);mContinuousTest.setLayoutResource(R.layout.main_preference);mIndividualTest.setLayoutResource(R.layout.main_preference);mTestResult.setLayoutResource(R.layout.main_preference);mCalibration.setLayoutResource(R.layout.main_preference);mUSBPreference.setOnPreferenceChangeListener(this);mROOTPreference.setOnPreferenceChangeListener(this);int ret = TestWrap.init();Log.v(TAG, "onCreate initialize = " + ret);//if (ret < 0) {// Toast.makeText(this, "error in mode initialization", Toast.LENGTH_LONG).show();// mHandler.sendEmptyMessageDelayed(MSG_ID_MAIN_AMT3_INIT_FAILED, 100);//}mActivity = this;mGpsEnabled = Settings.Secure.isLocationProviderEnabled(getContentResolver(),LocationManager.GPS_PROVIDER);Settings.Secure.setLocationProviderEnabled(getContentResolver(),LocationManager.GPS_PROVIDER, true);Log.d("leo","onCreate mGpsEnabled:"+mGpsEnabled);//[yeez_yuxiang.zhang added 2013.5.2 start. start locating at first]LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);criteria.setAltitudeRequired(true);criteria.setBearingRequired(true);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW);String provider = lm.getBestProvider(criteria, true);lm.requestLocationUpdates(provider, 1*1000, 100, new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}@Overridepublic void onLocationChanged(Location location) {}}); wifiManager = (WifiManager) getSystemService(Service.WIFI_SERVICE);wifiManager.setWifiEnabled(true);}@Overrideprotected void onResume() {SystemProperties.set("persist.sys.amt3", "1");Log.v(TAG, "onResume");super.onResume();int status = SystemProperties.getInt(STATUS, 0);Log.v(TAG, "onResume status = " + status);if (1 == status) {Log.v(TAG, "onResume in AMT MODE exit");Toast.makeText(Amt3MainActivity.this, R.string.amt_in_amt_mode_exit, Toast.LENGTH_SHORT).show();//isKillProcess = true;if (Amt3ChangeModeActivity.mActivity != null) {isKillProcess = true;}finish();//Intent intent = new Intent("android.action.amt3.start");//sendBroadcast(intent);} else {//mCheckBoxPreference.setChecked(isUsbAmt1());mCheckBoxPreference.setChecked(Utils.isPowerUsbAmt1());}SystemProperties.get("debug.mgrt.set");}/*** Called as part of the activity lifecycle when an activity is going into* the background, but has not (yet) been killed. The counterpart to* {@link #onResume}.** <p>When activity B is launched in front of activity A, this callback will* be invoked on A. B will not be created until A's {@link #onPause} returns,* so be sure to not do anything lengthy here.** <p>This callback is mostly used for saving any persistent state the* activity is editing, to present a "edit in place" model to the user and* making sure nothing is lost if there are not enough resources to start* the new activity without first killing this one. This is also a good* place to do things like stop animations and other things that consume a* noticeable amount of CPU in order to make the switch to the next activity* as fast as possible, or to close resources that are exclusive access* such as the camera.* * <p>In situations where the system needs more memory it may kill paused* processes to reclaim resources. Because of this, you should be sure* that all of your state is saved by the time you return from* this function. In general {@link #onSaveInstanceState} is used to save* per-instance state in the activity and this method is used to store* global persistent data (in content providers, files, etc.)* * <p>After receiving this call you will usually receive a following call* to {@link #onStop} (after the next activity has been resumed and* displayed), however in some cases there will be a direct call back to* {@link #onResume} without going through the stopped state.* * <p><em>Derived classes must call through to the super class's* implementation of this method. If they do not, an exception will be* thrown.</em></p>*/@Overrideprotected void onPause() {Log.v(TAG, "onPause");super.onPause();}/*** Perform any final cleanup before an activity is destroyed. This can* happen either because the activity is finishing (someone called* {@link #finish} on it, or because the system is temporarily destroying* this instance of the activity to save space. You can distinguish* between these two scenarios with the {@link #isFinishing} method.* * <p><em>Note: do not count on this method being called as a place for* saving data! For example, if an activity is editing data in a content* provider, those edits should be committed in either {@link #onPause} or* {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to* free resources like threads that are associated with an activity, so* that a destroyed activity does not leave such things around while the* rest of its application is still running. There are situations where* the system will simply kill the activity's hosting process without* calling this method (or any others) in it, so it should not be used to* do things that are intended to remain around after the process goes* away.* * <p><em>Derived classes must call through to the super class's* implementation of this method. If they do not, an exception will be* thrown.</em></p>*/@Overrideprotected void onDestroy() {Log.v(TAG, "onDestroy");Settings.Secure.setLocationProviderEnabled(getContentResolver(),LocationManager.GPS_PROVIDER, mGpsEnabled);super.onDestroy();updateTestResultSummary();int ret = TestWrap.deinit();Log.v(TAG, "onDestroy finalize = " + ret);//if (ret < 0) {// Toast.makeText(this, "error in mode finalization", Toast.LENGTH_LONG).show();//}if (isKillProcess) {Log.v(TAG, "onDestroy KillProcess");//android.os.Process.killProcess(android.os.Process.myPid());Intent intent = new Intent(TelephonyIntents.SECRET_CODE_ACTION,Uri.parse("android_secret_code://" + "388"));sendBroadcast(intent);}mActivity = null;SystemProperties.set("persist.sys.amt3", "0");}/*** This is called for activities that set launchMode to "singleTop" in* their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}* flag when calling {@link #startActivity}. In either case, when the* activity is re-launched while at the top of the activity stack instead* of a new instance of the activity being started, onNewIntent() will be* called on the existing instance with the Intent that was used to* re-launch it. * * <p>An activity will always be paused before receiving a new intent, so * you can count on {@link #onResume} being called after this method. * * <p>Note that {@link #getIntent} still returns the original Intent. You * can use {@link #setIntent} to update it to this new Intent. * * @param intent The new intent that was started for the activity. */@Overrideprotected void onNewIntent(Intent intent) {Log.v(TAG, "onNewIntent");int isFinish = getIntent().getIntExtra("finish", 0);Log.v(TAG, "onNewIntent isFinish = " + isFinish);int status = SystemProperties.getInt(STATUS, 0);Log.v(TAG, "onNewIntent status = " + status);if (1 == status || 1 == isFinish) {Toast.makeText(Amt3MainActivity.this, R.string.amt_in_amt_mode_exit, Toast.LENGTH_SHORT).show();isKillProcess = true;finish();}}/*** Called when a preference in the tree rooted at this* {@link PreferenceScreen} has been clicked.* * @param preferenceScreen The {@link PreferenceScreen} that the* preference is located in.* @param preference The preference that was clicked.* @return Whether the click was handled.*/@Overridepublic boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {Log.v(TAG, "onPreferenceTreeClick preference = " + preference.getKey());if (preference == mContinuousTest) {Intent intent = new Intent();intent.setClass(this, Amt3ContinuousTestActivity.class);startActivity(intent);} else if (preference == mIndividualTest) {Intent intent = new Intent();intent.setClass(this, Amt3IndividualTestActivity.class);startActivity(intent);} else if (preference == mTestResult) {Intent intent = new Intent();intent.setClass(this, Amt3ResultSummaryActivity.class);intent.putExtra("mode", TestWrap.TEST_MODE_SUMMARY);startActivity(intent);} else if (preference == mCalibration) {Intent intent = new Intent();intent.setClass(this, Amt3CalibrationActivity.class);startActivity(intent);} else if (preference == mCheckBoxPreference) {clickCheckBoxPreference();} else if (preference == mUSBPreference) {} else if (preference == mROOTPreference) {} else if (preference == mRestartCP) {setFile("/sys/misc-config/modem_pwr", "0");try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}setFile("/sys/misc-config/modem_pwr", "1");setFile("/sys/misc-config/spower_key", "1");Toast.makeText(this, getString(R.string.restart_cp_result), Toast.LENGTH_SHORT).show();} else {Log.v(TAG, "onPreferenceTreeClick preference invalid");}return super.onPreferenceTreeClick(preferenceScreen, preference);}private boolean isUsbAmt1() {int result = Native.app_amt3_usb_amt1(2);Log.v(TAG, "isUsbAmt1 result = " + result);if (1 == result) {return true;}return false;}private void clickCheckBoxPreference() {int result = -1;mCheckBoxPreference.setEnabled(false);ProgressDialog pdialog = new ProgressDialog(Amt3MainActivity.this);pdialog.setMessage(getString(R.string.waiting));pdialog.setIndeterminate(true);pdialog.setCancelable(false);pdialog.setCanceledOnTouchOutside(false);pdialog.show();Log.v(TAG, "clickCheckBoxPreference ProgressDialog show");boolean isChecked = mCheckBoxPreference.isChecked();Log.v(TAG, "clickCheckBoxPreference isChecked = " + isChecked);mCheckBoxPreference.setChecked(!isChecked);if (isChecked) {result = Native.app_amt3_usb_amt1(1);} else {result = Native.app_amt3_usb_amt1(0);}Log.v(TAG, "clickCheckBoxPreference result = " + result);if (0 != result) {mCheckBoxPreference.setChecked(!isChecked);Log.v(TAG, "clickCheckBoxPreference set failed");} else {mCheckBoxPreference.setChecked(isChecked);}pdialog.dismiss();pdialog = null;Log.v(TAG, "clickCheckBoxPreference ProgressDialog dismiss");mCheckBoxPreference.setEnabled(true);}private int updateTestResultSummary() {boolean isAllPass = true;boolean isAllNoTest = true;Log.v(TAG, "updateTestResultSummary");final String mMmiStation = SystemProperties.get(PROPERTY_AMT3_MMI_STATION, "18");Log.v(TAG, "updateTestResultSummary mMmiStation = " + mMmiStation);int station = Integer.parseInt(mMmiStation);if (station < 13 || station > 18) {Log.v(TAG, "updateTestResultSummary invalid station index");return -1;}int result = TestWrap.readStation(station);String description = TestWrap.readStationDescription(station);Log.v(TAG, "updateTestResultSummary description = " + description + " result = " + result);DataBuilder mDataBuilder = DataBuilder.getInstance(this);List<ITestItem> mItemsList = mDataBuilder.getContinuousTestItemsList();for (ITestItem it: mItemsList) {String key = it.getKey();int itemResult = TestWrap.readResult(key);Log.v(TAG, "updateTestResultSummary key = " + key + " itemResult = " + itemResult);if (itemResult == TestWrap.RESULT_PASS) {isAllNoTest = false;} else if (itemResult == TestWrap.RESULT_FAIL) {isAllPass = false;isAllNoTest = false;} else if (itemResult == TestWrap.RESULT_NO_TEST) {isAllPass = false;}}Log.v(TAG, "updateTestResultSummary isAllPass = " + isAllPass + " isAllNoTest = " + isAllNoTest);if (isAllPass) {description = MMI_PASS;result = TestWrap.RESULT_PASS;} else if (isAllNoTest) {description = MMI_NO_TEST;result = TestWrap.RESULT_NO_TEST;} else {description = MMI_FAIL;result = TestWrap.RESULT_FAIL;}Log.v(TAG, "updateTestResultSummary description = " + description + " result = " + result);return TestWrap.writeStationDescription(station, result, description); }public boolean onPreferenceChange(Preference preference, Object objValue) {Log.v(TAG, "onPreferenceChange----->"+String.valueOf(preference.getKey()));if (preference == mUSBPreference){Log.v(TAG, " Old Value"+ mUSBPreference.getValue()+" NewDeptName"+objValue);if(objValue.equals("001")){setFile("/sys/misc-config/usbsw", "0");}else if(objValue.equals("002")){setFile("/sys/misc-config/usbsw", "1");}else if(objValue.equals("003")){setFile("/sys/misc-config/usbsw", "1");setFile("/sys/misc-config/spower", "3");}else if(objValue.equals("004")){}}else if(preference == mROOTPreference){Log.v(TAG, " Old Value2"+ mROOTPreference.getValue()+" NewDeptName2"+objValue);if(objValue.equals("005")){SystemProperties.set("debug.mgrt.set","0");dialogExit(Amt3MainActivity.this,getString(R.string.CommonlyPattern));}else if(objValue.equals("006")){SystemProperties.set("debug.mgrt.set","1");dialogExit(Amt3MainActivity.this,getString(R.string.RootPattern));}}return true; }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;}void dialogExit(Context context,String name){AlertDialog.Builder builder = new Builder(context);builder.setMessage(name+getString(R.string.comfirm_restart));builder.setTitle(R.string.prompt);builder.setPositiveButton(R.string.ok,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}}