项目5记忆的仓库——备忘录 【教学导航】 学习目标 (1) 了解SharedPreferences实现简单的数据存储方法。 (2) 理解Android中的文件存储方法。 (3) 掌握摄像头调用和相册获取图片的方法。 (4) 了解Android运行时权限设置。 (5) 具备较复杂案例的设计开发能力。 教学方法任务驱动法、理论实践一体化、探究学习法、分组讨论法 课时建议 8课时 5.1SharedPreferences存储 Android中常用的三大存储方式分别是SharedPreferences存储、文件存储和数据库存储。其中,SharedPreferences存储在程序中有少量的数据需要保存时使用,它存储数据的格式很简单,采用键值对的方式来存储数据。文件存储主要用来存储资源文件,如一篇日记、一首歌等。数据库存储常用于当程序中有大量数据需要存储、访问时,就需要借助于数据库,Android内置了SQLite数据库。本节将针对SharedPreferences存储进行讲解。 微课视频 5.1.1SharedPreferences简介 SharedPreferences是Android平台上一个轻量级的存储类,常用于存储一些应用程序的配置参数,例如用户名、密码、是否打开同步、是否打开音响、自定义参数的设置等。SharedPreferences中存储的数据是以keyvalue(键值)对的形式保存在XML文件中,需要注意的是,SharedPreferences中的value值只能是float、int、long、boolean、String、StringSet类型数据。 1. SharedPreferences常用方法 SharedPreferences提供了一系列的方法用于获取应用程序中的数据,具体如表5.1所示。 表5.1SharedPreferences常用方法 属性功能描述实例 getSharedPreferences(String name,String mode)获取SharedPreference的实例对象 SharedPreference sp=this.getSharedPreferences("myinfo",0) getString(String key,String defValue) 获取SharedPreferences中指定的key对应的String值 getSharedPreferences("myinfo",0).getString("name",""); getInt(String key,int defValue) 获取SharedPreferences中指定的key对应的int值 getSharedPreferences("myinfo",0).getInt("age",0); getBoolean(String key,boolean defValue) 获取SharedPreferences中指定的key对应的boolean值 getSharedPreferences("info",0).getBoolean("married",false); getFloat(String key,float defValue) 获取SharedPreferences中指定的key对应的float值 getSharedPreferences("info",0).getFloat("weight",0); getLong(String key,long defValue) 获取SharedPreferences中指定的key对应的long值 getSharedPreferences("info",0).getLong("birthdistance",0); 表5.1中,使用SharedPreferences类存储数据时,首先需要通过context. getSharedPreferences(String name, int mode)获取SharedPreferences的实例对象,其中context表示上下文环境,在Activity中可以直接使用this代表上下文,如果不是在Activity中则需要传入一个Context对象获取上下文。 getSharedPreferences(String name,String mode)方法中,第一个参数name表示文件名,如果指定的文件不存在则会创建一个新文件,该文件存放在data/data//shared_prefs目录下。第二个参数mode用于指定文件操作模式,目前只有MODE_PRIVATE这一种模式可选,指定该SharedPreferences数据只能被本应用程序读写,它是默认的操作模式,和直接传入0效果是相同的,其他几种模式从Android 4.2版本开始均已废弃。 getXxx(String,xxx value)获取SharedPreferences数据里指定key对应的value。如果该key不存在,则返回默认值value。其中,xxx可以是boolean、float、int、long、String等多种基本类型。 2. SharedPreferences.Editor常用方法 SharedPreferences对象本身只能获取数据,并不支持数据的存储和修改,数据的存储和修改需要通过SharedPreferences.Editor对象来实现。要想获取Edit实例对象,需要调用SharedPreferences.Editor的edit()方法,Editor提供一系列方法来向SharedPreferences写入数据,如表5.2所示。 表5.2SharedPreferences.Editor常用方法 方法功能描述实例 SharedPreferences.Editor edit()创建一个Editor对象SharedPreferences.Editor editor=this. getSharedPreferences("myinfo",0).edit(); SharedPreferences.Editor putString(String key,String value) 向SharedPreferences中存入指定key对应的String 值 editor.putString("name","张三"); SharedPreferences.Editor putInt(String key,int value) 向SharedPreferences中存入指定key对应的int值 editor.putInt("age",20); SharedPreferences.Editor putBoolean(String key,boolean value) 向SharedPreferences中存入指定key对应的boolean值 editor.putBoolean("married",false); SharedPreferences.Editor putFloat(String key,float value) 向SharedPreferences中存入指定key对应的float值 editor.putFloat("weight",76.5f); (其中,f表示float) SharedPreferences.Editor putLong(String key,long value) 向SharedPreferences中存入指定key对应的long值 editor.putLong("birthdistance",154672920439l); (其中,l表示long) SharedPreferences.Editor remove(String key) 删除SharedPreferences中指定key对应的数据 editor.remove("weight"); boolean commit() 提交数据,返回boolean表明提交是否成功 editor.commit(); SharedPreferences.Editor apply() 提交数据,没有返回值 editor.apply(); SharedPreferences.Editor clear() 清除SharedPreferences中的所有数据 SharedPreferences.Editor editor1=getSharedPreferences("myinfo",0).edit(); editor1.clear(); editor1.commit(); 微课视频 5.1.2SharedPreferences的使用 1. 将数据存储到SharedPreferences中 使用SharedPreferences存储数据时,需要先获取SharedPreferences对象,通过该对象的edit()方法获取到Editor对象,然后通过Editor对象的相关方法存储数据,具体代码如下。 SharedPreferences.Editor editor=getSharedPreferences("myinfo",0).edit(); //获取编辑器editor editor.putString("name","张三"); //存入String类型数据 editor.putInt("age",20); //存入int类型数 editor.putBoolean("married",false); //存入boolean类型数据 editor.putFloat("weight",76.8f); //存入float类型数据 editor.putLong("birthdistance",154672920439l); //存入long类型数据 editor.commit();   //提交数据,保存成功 2. 从SharedPreferences中读取数据 SharedPreferences获取数据比较简单,只需要创建SharedPreferences对象,然后使用该对象获取相应key的值即可。具体代码如下。 String myname=getSharedPreferences("myinfo",0).getString("name",""); //获取用户名 int myage=getSharedPreferences("myinfo",0).getInt("age",0); //获取年龄 float weight=getSharedPreferences("info",0).getFloat("weight",0); //获取体重 boolean mymarried=getSharedPreferences("info",0).getBoolean("married",false); //获取婚姻状态 long mybirthdistance=getSharedPreferences("info",0).getLong("birthdistance",0); //获取出生到现在的时长 3. 删除SharedPreferences中的数据 SharedPreferences删除数据与存储数据类似,同样需要先获取到Editor对象,然后通过该对象删除数据,最后提交,具体代码如下。 SharedPreferences.Editor editor1=getSharedPreferences("myinfo",0).edit(); //获取编辑器对象,取名为editor1 editor1.remove("name"); //删除一条数据 editor1.clear(); //删除所有数据 editor1.commit(); //提交数据,保存成功 SharedPreferences使用很简单,但一定要注意以下两点。 (1) 存入数据和删除数据时,一定要在最后使用editor.commit()方法提交数据。 (2) 读取数据的key值与存入数据的key值的数据类型要一致,否则查找不到数据。 4. SharedPreferences案例 1) 案例分析 (1) 界面分析。布局界面中有5个控件,其中两个EditText控件用于输入用户名和密码,复选框CheckBox供用户选择是否需要记住密码,“登录”按钮保存信息并跳转到第二个页面。 (2) 设计思路。布局界面中的控件通过添加属性的方式达到用户需求,在登录按钮单击事件内部实现用户名、密码、复选框状态等数据的存储,下次启动App时,根据复选框的状态决定是否显示存储的用户名和密码。 2) 实现步骤 (1) 创建一个新的工程,工程名为ZSSharedPreferences。 (2) 切换工程的Project项目结构。选择该模式下方的App,依次展开,便看到工程的布局界面和工程的类文件,其中,activity_main.xml是布局界面,MainActivity.java为类文件。 (3) 在工程中添加一个新的页面。右击com.example. zssharedpreferences包→New→Activity→Empty Activity,会弹出一个创建活动的对话框,将活动命名为SecondActivity,默认勾选Generate Layout File关联布局界面,布局界面名称为activity_second,但不要勾选Launcher Activity。单击Finish按钮,便完成了第二个页面的添加。 (4) 准备一张图片,图片名为bgtwo.jpg,将其粘贴到app目录结构中res下方的drawable文件夹下,作为登录页面的背景图片。 (5) 修改布局界面。在app目录下的结构中,双击layout文件夹下的activity_main.xml文件,便可打开布局编辑器,切换到Text选项卡,输入代码如下。