先编写一个简单的QQ登录界面作为实验界面
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@mipmap/qq_login"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:orientation="vertical" android:padding="30dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@mipmap/ic_launcher" android:text="QQ" android:textColor="#888888" android:textSize="50sp"/> <EditText android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="30dp" android:hint="QQ号码\手机号码\邮箱" android:textColorHint="#888888"/> <EditText android:layout_width="match_parent" android:layout_height="match_parent" android:hint="密码" android:textColorHint="#888888"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录" android:textSize="20sp"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="忘记密码" android:textColor="#00aaff" android:textSize="16sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="新用户注册" android:textColor="#00aaff" android:textSize="16sp" android:layout_alignParentRight="true"/> </RelativeLayout> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="登录即代表阅读并同意相关条款" android:layout_marginBottom="50dp" android:textColor="#777777" android:textSize="20sp"/> </RelativeLayout>
效果如下
<1>把数据存储到该应用的数据目录(\data)中
首先对登录按钮、账号输入框、密码输入框这三个控件设置id
然后对登录按键设置监听事件(点击登录按钮,就会触发监听事件,将账号框和密码框中的内容存储起来)
private void handlerLoginEvent(View v){ //点击登录按钮后,要拿到界面上的内容(账号和密码) String accountText = account.getText().toString(); String passwordText = password.getText().toString(); //把账户和密码保存起来 //利用流把它们写到文件中保存起来 saveUserInfo(accountText,passwordText); } private void saveUserInfo(String a,String p){ //把账号和密码存储起来的方法 Log.d(TAG,"保存用户的账号和密码..."); try { File file = new File("/data/data/com.example.qq_logindemo/zhanghu.txt"); if(!file.exists()){ file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); //以特定的格式来存储:账号***密码 fos.write((a +"***" + p).getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
——这里需要注意的是,文件保存的路径如何确定?
如果我们直接写File file=new File("zhanghu.txt")是会出错的,因为Android系统是基于Linux系统的,不像windows系统一样有C盘D盘之类的盘进行区分,它的根目录就是"/"
而每一个Android程序就是一个用户,在linux下权限的划分非常清楚,每一个用户只能操作自己的数据,具有安全性
所以我们必须将账号和密码的信息保存到我们的这个qq_logindemo应用的数据目录中才可以
——如何找到具体路径呢?
打开cmd,输入adb devices查看我们的虚拟设备
输入adb shell进入该设备的Android内核
输入ll查看目录可以看到有一个data文件夹
进入data文件夹中,可以看到还有一个data文件夹,再次进入(即cd data,再次cd data)
在/data/data目录下我们再次ll查看目录,就可以看到我们应用程序的数据文件地址了
com.example.qq_logindemo就是我们的应用程序数据地址(也可以在AS中我们的项目中manifests下的AndroidManifest.xml中找到验证)
当我们在手机上输入账号和密码,按下登录按键后,就会在该程序的目录下创建了一个zhanghu.txt文本按照"账号***密码"的格式存储我们的数据,验证一下:
<2>查看保存的数据
——第一种方式:在Android系统内核中用linux命令 cat zhanghu.txt 查看文本文件的内容
——第二种方式:在AS中,上方菜单栏View中选择Tool Windows中的Devices File Explorer即可
然后即可在AS中查看到该设备的所有文件,找到/data/data/com.example.qq_logindemo/zhanghu.txt打开即可看到
<3>获取文件保存路径的另一种方法——利用系统自带的API
在第一个模块中, 我们选择了通过adb命令进入Android内核,然后再用Linux系统的相应操作找到文件存储的位置
其实还有一种更便捷的方式,直接在代码里用系统自带的API即可
private void saveUserInfo(String a,String p){ //把账号和密码存储起来的方法 Log.d(TAG,"保存用户的账号和密码..."); //利用API获取文件保存的路径 File filesDir = this.getFilesDir(); //输出文件保存的路径 Log.d(TAG,"files dir == " + filesDir.toString()); //利用API获取的路径来自动在下面创建一个文本,保存账号和密码 File saveFile = new File(filesDir,"zhanghu.txt"); try { /* File file = new File("/data/data/com.example.qq_logindemo/zhanghu.txt"); if(!file.exists()){ file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); */ if(!saveFile.exists()){ saveFile.createNewFile(); } FileOutputStream fos = new FileOutputStream(saveFile); //以特定的格式来存储:账号***密码 fos.write((a +"***" + p).getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
(即 this.getFileDir() 方法拿到的路径就是 /data/data/包名/files 这个路径)
(同理,获取缓存文件存储的路径也是有相应的方法 this.getCacheDir() )
缓存文件,保存在cache目录中,会由系统根据存储情况自动进行清理
而files目录下是我们自己保存文件的地址,可以通过代码删除,也可以通过手机里的应用列表中的选项进行删除数据
<4>对输入的数据进行判空
在设计qq登录界面时,需要对输入的账号密码进行各种检查
(在实际开发中,各种合法性检查一般交给后台处理)
这里对账号和密码的判空处理进行练习,两种方法
<5>把存储的账号和密码从文件中读取出来,回显到界面上
<6>把数据存储到SD卡中
在Android设备中,其实是有两种存储空间:
——一是系统内部存储空间:ROM,就类似于Windows系统的C盘,在Android系统中只有一个ROM盘,因为它是基于Linux系统的
——二是外置存储空间:也就是SD卡等外部存储设备,类似于Windows系统的外插存储设备
首先,外部存储设备在Linux系统中是需要挂载的
adb devices,然后adb shell 进入Android内核,然后 cd /mnt 即可进入挂载的目录
ll查看sd卡所挂载的路径
然后写代码,设置一个点击按键,点击后往SD卡中存储数据
需要注意的是,往SD卡中存储和读取数据也是要获取权限的
我们要在AndroidManifest.xml中配置一下,加入读写权限
然后在界面点击按键,去挂载SD卡的路径中就可以看到新建的一个文件了
<7>使用API获取SD卡路径以及判断SD卡是否挂载以及查看SD卡剩余存储空间大小
和前面的获取数据的内部存储路径一样,SD卡的路径也可以通过调用API来实现
File exFile = Environment.getExternalStorageDirectory();
这种方法的好处是什么呢?
一是避免写错,二是因为不同的手机厂商,它们默认的SD卡路径名不一样,通过这个API,可以便捷得获取到SD卡的路径
如何判断是否挂载了SD卡?
也可以通过一个API
如何查看SD卡剩余的存储空间大小?
<8>编写设置界面SharedPreference
SharedPreference一般用于保存偏好设置,例如手机设置界面里的各个选项
(在Android系统中,分为内部存储和外部存储,而内部存储又分为以下几种路径:
——/data/data/包名/files:存储文件
——/data/data/包名/caches:存储缓存
——/data/data/包名/databases:存储数据库
——/data/data/包名/shared_prefs:存储设置,也就是用户偏好)
SharedPreference的使用步骤:
1.首先拿到这个SharedPreference
用this.getSharedPreference()方法,里面的两个参数第一个是表示存储的文件名称,第二个表示权限
2.进入编辑模式,拿到编辑器
3.保存数据
edit.putBoolean("键名称", 值);
可以保存的类型有String,float,StringSet,int
4.提交编辑器
edit.commit();
通过这四步,我们即可将数据保存在SharedPreference里了
SharedPreference中的数据回显?
SharedPreference存储的数据都是键值对