这篇主要是具体例子,可以先看一下理论,网址是:Android中Preference的使用以及监听事件分析
我们可以先看一下效果图
我们先截取不小段布局,代码如下:
<ListPreference android: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 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() { @Override public 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; @Override protected 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() { @Override public void onStatusChanged(String provider, int status, Bundle extras) {} @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} @Override public void onLocationChanged(Location location) {} }); wifiManager = (WifiManager) getSystemService(Service.WIFI_SERVICE); wifiManager.setWifiEnabled(true); } @Override protected 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> */ @Override protected 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> */ @Override protected 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. */ @Override protected 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. */ @Override public 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 block e.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() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }