hello,大家好,今天上传一下本人对于android 中sharedpreference的理解,以及自己使用的一个Demo的讲解。
SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
SharedPreferences相对于sqllite使用起来相当方便,但是SharedPreferences也只能存储boolean,int,float,long和String五种简单的数据类型,本文在上述五种类型的基础上增加了图片的保存,并将其封装成了一个可以快速使用的java类,下面进行代码的展示跟演示:
PreferencesUtils.java文件:
其中将SharedPreferences的五种类型以及图片的读取和存储都写好了,使用时可直接引入到项目中进行快速开发。
package com.example.sharedpreferencedtestdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap.CompressFormat; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.Base64; public class PreferencesUtils { public static String PREFERENCE_NAME = "TrineaAndroidCommon"; /** * put string preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putString(Context context, String key, String value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putString(key, value); return editor.commit(); } /** * get string preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or null. Throws ClassCastException if there is a preference with this * name that is not a string * @see #getString(Context, String, String) */ public static String getString(Context context, String key) { return getString(context, key, null); } /** * get string preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a string */ public static String getString(Context context, String key, String defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getString(key, defaultValue); } /** * put int preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putInt(Context context, String key, int value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putInt(key, value); return editor.commit(); } /** * get int preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a int * @see #getInt(Context, String, int) */ public static int getInt(Context context, String key) { return getInt(context, key, -1); } /** * get int preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a int */ public static int getInt(Context context, String key, int defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getInt(key, defaultValue); } /** * put long preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putLong(Context context, String key, long value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putLong(key, value); return editor.commit(); } /** * get long preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a long * @see #getLong(Context, String, long) */ public static long getLong(Context context, String key) { return getLong(context, key, -1); } /** * get long preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a long */ public static long getLong(Context context, String key, long defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getLong(key, defaultValue); } /** * put float preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putFloat(Context context, String key, float value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putFloat(key, value); return editor.commit(); } /** * get float preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a float * @see #getFloat(Context, String, float) */ public static float getFloat(Context context, String key) { return getFloat(context, key, -1); } /** * get float preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a float */ public static float getFloat(Context context, String key, float defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getFloat(key, defaultValue); } /** * put boolean preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putBoolean(Context context, String key, boolean value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean(key, value); return editor.commit(); } /** * get boolean preferences, default is false * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a boolean * @see #getBoolean(Context, String, boolean) */ public static boolean getBoolean(Context context, String key) { return getBoolean(context, key, false); } /** * get boolean preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a boolean */ public static boolean getBoolean(Context context, String key, boolean defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getBoolean(key, defaultValue); } /** * get picture preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a picture */ public static Drawable getPicture(Context context,String key){ return getPicture(context, key,""); } /** * get picture preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a picture */ public static Drawable getPicture(Context context,String key,String defaultValue){ SharedPreferences settings=context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); String srcName=settings.getString(key, defaultValue); byte[] base64Bytes = Base64.decode(srcName, 1); ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes); return Drawable.createFromStream(bais, srcName); } /** * put picture preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static Boolean putPicture(Context context,String key,Drawable value){ SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ((BitmapDrawable) value).getBitmap().compress(CompressFormat.JPEG, 100, baos); String srcName = new String(Base64.encodeToString( baos.toByteArray(), 1)); editor.putString(key, srcName); return editor.commit(); } }
下面是Demo的XML文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/edt_string" android:layout_width="match_parent" android:layout_height="50dp" android:hint="请输入要保存的内容" /> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" > <TextView android:id="@+id/txt_boolen" android:layout_width="0dp" android:layout_height="50dp" android:layout_marginTop="10dp" android:layout_weight="1" android:text="现在是True" /> <Button android:id="@+id/changeBool" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:onClick="changeBool" android:text="chanageBool" android:textSize="12sp" /> </LinearLayout> <ImageView android:id="@+id/customer_img_shop" android:layout_width="100dp" android:layout_height="100dp" android:clickable="true" android:onClick="changepicture" android:src="@drawable/nopicture" /> <Button android:id="@+id/save" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="save" android:text="采用SharedPreference保存上述类容" /> <Button android:id="@+id/read" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="read" android:text="采用SharedPreference读出上述类容"/> </LinearLayout>
以及Demo的MainActivity文件,其中由于要保存图片,于是加了一个拍照和读取本地文件的功能,有需要的朋友也可以看看,没需要的朋友就可以直接略过了。
MainActivity.java:
package com.example.sharedpreferencedtestdemo; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private Boolean nowBoolean=true; private EditText edt_string; private TextView txt_boolen; private TextView take_picture_tv; private TextView gallery_tv; private String ImageName; private static final int REQUESTCODE_TAKEPICTURE = 1; private static final int REQUESTCODE_PICTUREROOM = 2; private static final int REQUESTCODE_TAKEPICTURE_CUT = 3; private String imagepath = "image/*"; private Bitmap tmpBitmap; private ImageView customer_img_shop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txt_boolen=(TextView) findViewById(R.id.txt_boolen); edt_string=(EditText) findViewById(R.id.edt_string); customer_img_shop=(ImageView) findViewById(R.id.customer_img_shop); } //将当前Bool值置反 public void changeBool(View view){ if (nowBoolean==true){ nowBoolean=false; txt_boolen.setText("现在是false"); }else if (nowBoolean==false) { nowBoolean=true; txt_boolen.setText("现在是true"); }else { Toast.makeText(this, "Rrror!", Toast.LENGTH_SHORT).show(); return; } } //点击图片的地方选择图片 public void changepicture(View view){ takepicture(); } //点击保存SharedPreference数据 public void save(View view){ PreferencesUtils.putBoolean(this, "Boolen", nowBoolean); PreferencesUtils.putString(this, "String", edt_string.getText().toString()); PreferencesUtils.putPicture(this, "picture", customer_img_shop.getDrawable()); } //点击读取已保存的SharedPreference数据 public void read(View view){ nowBoolean=PreferencesUtils.getBoolean(this, "Boolen", true); if (nowBoolean==true){ txt_boolen.setText("现在是true"); }else if (nowBoolean==false) { txt_boolen.setText("现在是false"); }else { Toast.makeText(this, "Rrror!", Toast.LENGTH_SHORT).show(); return; } edt_string.setText(PreferencesUtils.getString(this, "String", "")); customer_img_shop.setImageDrawable(PreferencesUtils.getPicture(this, "picture")); } // 选择本地照片/拍摄新的照片 private void takepicture() { final AlertDialog imgdialog = new AlertDialog.Builder( this).show(); imgdialog.setContentView(R.layout.settings_photo); take_picture_tv = (TextView) imgdialog .findViewById(R.id.take_picture_tv); gallery_tv = (TextView) imgdialog.findViewById(R.id.gallery_tv); // 调用相机 take_picture_tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { ImageName = "/picture.jpg"; Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri .fromFile(new File(Environment .getExternalStorageDirectory(), ImageName))); if (CommonTools.isIntentAvailable( MainActivity.this, intent)) { startActivityForResult(intent, REQUESTCODE_TAKEPICTURE); } else { Toast.makeText(MainActivity.this, R.string.persional_information_camera_notexist, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } imgdialog.dismiss(); } }); // 从相册选择 gallery_tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imagepath); startActivityForResult(intent, REQUESTCODE_PICTUREROOM); imgdialog.dismiss(); } }); } // 处理图片-------------------------------------------------------------------------------- @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } // 拍照 if (requestCode == REQUESTCODE_TAKEPICTURE) { // 设置文件保存路径这里放在根目录下 File picture = new File(Environment.getExternalStorageDirectory() + ImageName); startPhotoZoom(Uri.fromFile(picture)); } if (data == null) { return; } // 相册 if (requestCode == REQUESTCODE_PICTUREROOM) { startPhotoZoom(data.getData()); } if (requestCode == REQUESTCODE_TAKEPICTURE_CUT) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); tmpBitmap = photo; customer_img_shop.setImageBitmap(tmpBitmap); FileOutputStream stream = null; try { stream = new FileOutputStream(this.getApplicationContext() .getFilesDir().getAbsolutePath() + "/shop.jpg"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (photo != null && stream != null) { photo.compress(Bitmap.CompressFormat.JPEG, 100, stream); // face.setImageBitmap(photo); } } super.onActivityResult(requestCode, resultCode, data); } } // 处理图片的大小 public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, imagepath); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", MyTools.dip2px(this, 150)); intent.putExtra("outputY", MyTools.dip2px(this, 150)); intent.putExtra("return-data", true); intent.putExtra("scale", true); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", false); startActivityForResult(intent, REQUESTCODE_TAKEPICTURE_CUT); } }