记录学习笔记:

目录

1.SharedPreferences存储

2.文件存储:


SharedPreferences存储源码(QQlogin2):https://github.com/liuchenyang0515/QQlogin2

文件存储源码(QQlogin):https://github.com/liuchenyang0515/QQlogin


1.SharedPreferences存储

界面如下:

MainActivity.java

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    /**
     * 定义一个共享参数(存放数据方便的api)
     */
    private SharedPreferences sp;
    private String TAG = "MainActivity";
    private EditText et_qqnumber;
    private EditText et_passwd;
    private CheckBox cb_remember;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_qqnumber = (EditText) findViewById(R.id.et_qqnumber);
        et_passwd = (EditText) findViewById(R.id.et_passwd);
        cb_remember = (CheckBox) findViewById(R.id.cb_remember);
        sp = this.getSharedPreferences("config", MODE_PRIVATE);
        restoreInfo();
    }

    /**
     * 根据原来保存的文件信息,把QQ号码和密码信息显示到界面
     */
    private void restoreInfo() {
        String qq = sp.getString("qq", "");
        String passwd = sp.getString("passwd", "");
        boolean isRemember = sp.getBoolean("remember", false);
        Log.d(TAG, "qq:" + qq);
        Log.d(TAG, "passwd:" + passwd);
        et_qqnumber.setText(qq);
        et_passwd.setText(passwd);
        cb_remember.setChecked(isRemember); // 恢复时也把记住密码的勾选上
    }

    /**
     * 登录按钮的点击事件
     *
     * @param view
     */
    public void login(View view) {
        String qq = et_qqnumber.getText().toString().trim();
        String passwd = et_passwd.getText().toString().trim();
        if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(passwd)) {
            Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
            return;
        } else {
            // 登录操作,模拟登陆,数据应该提交给服务器比较是否正确
            if ("10000".equals(qq) && "123456".equals(passwd)) {
                // 是否需要记住密码
                // 将数据保存到sp文件中
                SharedPreferences.Editor edit = sp.edit();
                if (cb_remember.isChecked()) {
                    edit.putString("qq", qq);
                    edit.putString("passwd", passwd);
                    edit.putBoolean("remember", true);
                } else {
                    edit.clear(); // 没有勾选记住密码就清空SharedPreferences文件数据
                }
                edit.apply(); // 提交数据,类似于关闭流,事务
                Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

xml文件参考如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/qq" />

    <EditText
        android:id="@+id/et_qqnumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="请输入QQ号码"
        android:inputType="number"
        android:selectAllOnFocus="false" />

    <EditText
        android:id="@+id/et_passwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="请输入QQ密码"
        android:inputType="textPassword" />

    <CheckBox
        android:id="@+id/cb_remember"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="记住密码" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="login"
        android:text="登录" />

</LinearLayout>

存储config.xml如下:

====================================================================


2.文件存储:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {

    private EditText et_qqnumber;
    private EditText et_passwd;
    private CheckBox cb_remember;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_qqnumber = (EditText) findViewById(R.id.et_qqnumber);
        et_passwd = (EditText) findViewById(R.id.et_passwd);
        cb_remember = (CheckBox) findViewById(R.id.cb_remember);
        restoreInfo();
    }

    /**
     * 根据原来保存的文件信息,把QQ号码和密码信息显示到界面
     */
    private void restoreInfo() {
        // File file = new File(this.getFilesDir(), "info.txt");
        // 用openFileInput就不需要判断file.exists() && file.length() > 0了
        // 函数封装会处理的
        // 自动关流写法要jdk1.7及以上
        try (//FileInputStream fis = new FileInputStream(file);
             FileInputStream fis = openFileInput("info.txt");
             BufferedReader br = new BufferedReader(new InputStreamReader(fis));) {
            String line = br.readLine();
            if (line != null){
                String[] info = line.split("##");
                String qq = info[0];
                String pwd = info[1];
                et_qqnumber.setText(qq);
                et_qqnumber.setSelection(qq.length());
                et_passwd.setText(pwd);
                cb_remember.setChecked(true);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 登录按钮的点击事件
     *
     * @param view
     */
    public void login(View view) {
        String qq = et_qqnumber.getText().toString().trim();
        String passwd = et_passwd.getText().toString().trim();
        if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(passwd)) {
            Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
            return;
        } else {
            // 是否需要记住密码
            try (
                    //FileOutputStream fos = new FileOutputStream(new File(this.getFilesDir(), "info.txt"));
                    FileOutputStream fos = openFileOutput("info.txt", MODE_PRIVATE);
                    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));) {
                // 登录操作,模拟登陆,数据应该提交给服务器比较是否正确
                if ("10000".equals(qq) && "123456".equals(passwd)) {
                    Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
                    if (cb_remember.isChecked()) {
                        // 被选中状态,需要记住密码
                        String info = qq + "##" + passwd;
                        //fos.write(info.getBytes());
                        writer.write(info);
                    } else {
                        writer.write(""); // 空文件
                    }
                } else {
                    Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

笔记批注:如果想要修改文件的权限的话,可以进入到相应的目录,然后例如:chmod 777 private.txt就可以把权限改为

-rwxrwxrwx,每一个权限组都是3位2进制数。


========================================Talk is cheap, show me the code=======================================