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中我选择进行了String,Boolean(个人理解用来保存开关之类的比较方便),图片三种比较常用的保存。

下面是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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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();}});}// 处理图片--------------------------------------------------------------------------------@Overridepublic 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 blocke.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);}}


Demo下载地址: http://download.csdn.net/detail/a332802774/8472467
希望能够帮到大家,谢谢观看!

更多相关文章

  1. Android(安卓)常用设计模式
  2. React Native中gif格式图片无法在Android中显示问题
  3. Android—(获取并解析xml和Json)
  4. Android(安卓)XML解析学习——Sax方式
  5. android:打开系统联系人界面并获取数据
  6. Android之-----Frame帧动画(Animation)
  7. Android(安卓)Socket 开发
  8. android 图片Bitmap的旋转
  9. android之cursor

随机推荐

  1. 分享 9 个 JavaScript 可视化工具
  2. 深度好文 |Matplotlib 可视化最有价值的 5
  3. Oracle基本操作+Java连接Oracle
  4. Python英语 - Issue16
  5. 思科dhcp和链路捆绑
  6. 2019年1-5月文章汇总 | Python数据之道
  7. Android中的UI线程详解
  8. 可视化神器 Plotly Express 合并到 Plotl
  9. JVM的新生代跟老年代
  10. 用Python快速分析和预测股票价格