1. 程式人生 > >Android學習系列(二): 儲存檔案到手機記憶體-模擬使用者登入儲存使用者資訊

Android學習系列(二): 儲存檔案到手機記憶體-模擬使用者登入儲存使用者資訊

今天要學習如何儲存檔案到手機記憶體中,具體思想如下:

(1)建立登入的Activity,包含使用者名稱EditText,密碼EditText,記住密碼CheckBox 和登入按鈕Button。

(2)建立儲存和讀取檔案的業務類,以供activity入口類呼叫。

(3)建立登入Activity的入口class,監聽登入按鈕,如果在手機記憶體中存在使用者資訊檔案,讀取使用者資訊,回填到使用者密碼輸入框中; 如果記住密碼的Checkbox被勾選上,則將使用者資訊寫入手機記憶體

具體程式碼實現如下:

(1)建立新的project,包名為com.android.log,在main.xml中構建登入介面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/user_text"
            />
    <EditText
            android:id="@+id/et_username"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/password_text"
            />
    <EditText
            android:id="@+id/et_password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            />
    <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

        <CheckBox
                android:id="@+id/cb_remember"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/checkbox_text"
                android:checked="true"
                />

        <Button
                android:id="@+id/bt_login"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/button_text"
                android:layout_alignParentRight="true"
                />
    </RelativeLayout>

</LinearLayout>


注意,在String.xml中將你的string變數都宣告。

(2)建立儲存和讀取檔案的業務類,以供activity入口類呼叫。我把新建的class放在了com.android.login.service下,帳號和密碼先簡單地以“帳號##密碼”的格式儲存到相應應用的cache資料夾的info.txt 檔案中。

讀取檔案時,將使用者資訊按“##”拆分,儲存到Map中,返回。

由於該類不涉及到其他自定義類,我們可以把儲存和讀取的方法寫成static

package com.android.login.service;

import android.content.Context;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by nancy on 15-9-17.
 */
public class SaveFile {
    /**
     * 儲存使用者登入資訊
     * @param context 上下文
     * @param username
     * @param password
     * @return 是否儲存成功
     */
    public static boolean saveFileToAndroid(Context context, String username, String password){
        try {
            //File file = new File("/data/data/com.android.login/info.txt");
            //為了避免直接去包的檔案路徑,我們可以傳入上下文,取得包的檔案路徑或者快取路徑
            //File file = new File(context.getFilesDir(), "info.txt");
            File file = new File(context.getCacheDir(), "info.txt");

            FileOutputStream fileOutStream = new FileOutputStream(file);
            fileOutStream.write((username+"##"+password).getBytes() );
            fileOutStream.close();

            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 讀取檔案,返回使用者資訊
     * @param context 上下雯
     * @return 使用者資訊
     */
    public static Map<String,String> getSaveUserInfo(Context context){
        File file = new File(context.getCacheDir(), "info.txt");
        try{
            FileInputStream fileInputStream = new FileInputStream(file);
            BufferedReader bufferReader = new BufferedReader(new InputStreamReader(fileInputStream) );
            String cache = bufferReader.readLine();

            String[] caches = cache.split("##");
            Map<String,String> userInfo = new HashMap<String, String>();
            userInfo.put("username", caches[0]);
            userInfo.put("password", caches[1]);

            return userInfo;

        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

(3)建立登入Activity的入口class,監聽登入按鈕,如果在手機記憶體中存在使用者資訊檔案,讀取使用者資訊,回填到使用者密碼輸入框中; 如果記住密碼的Checkbox被勾選上,則將使用者資訊寫入手機記憶體。

我們先模擬登入,直接在程式碼中判斷是否與指定的使用者名稱密碼一致。

package com.android.login;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import com.android.login.service.SaveFile;

import java.util.Map;

public class MainActivity extends Activity implements View.OnClickListener{
    private EditText userName;
    private EditText passWord;
    private CheckBox remember;
    private Button login;
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        userName = (EditText)this.findViewById(R.id.et_username);
        passWord = (EditText)this.findViewById(R.id.et_password);
        remember = (CheckBox)this.findViewById(R.id.cb_remember);
        login = (Button) this.findViewById(R.id.bt_login);

        //判斷是否有快取使用者資訊,有的需要取出
        Map<String, String> userInfo = SaveFile.getSaveUserInfo(this);
        if( null != userInfo){
            userName.setText(userInfo.get("username"));
            passWord.setText(userInfo.get("password"));
        }


        login.setOnClickListener(this);

    }
    @Override
    public void onClick(View v){
        switch (v.getId()){
            case R.id.bt_login:
                this.loginSys();
                break;
            default:
                break;
        }
    }

    public void loginSys(){

        String username = this.userName.getText().toString().trim();
        String password = this.passWord.getText().toString().trim();
        if( TextUtils.isEmpty(username) || TextUtils.isEmpty(password) ){
            Toast.makeText(MainActivity.this,"使用者名稱和密碼不能為空",Toast.LENGTH_SHORT).show();
            return;
        }

        if(remember.isChecked()){
            //儲存檔案
           if(SaveFile.saveFileToAndroid(this,username,password)){
               Toast.makeText(MainActivity.this,"儲存使用者資訊檔案成功",Toast.LENGTH_SHORT).show();
           }
        }
        //模擬登入
        if("nancy".equals(username) && "123456".equals(password) ){
            Toast.makeText(MainActivity.this,"登入成功",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(MainActivity.this,"登入失敗",Toast.LENGTH_SHORT).show();
        }


    }
}
最後,我們開啟Android模擬器,允許project,輸入使用者密碼,點選登入,這時會提示我們儲存使用者資訊檔案成功,我們開啟Android Device Monitor,選擇我們目前執行的Android模擬器,在File Explorer中可以看到android的記憶體檔案,我們找到“data/data/com.android.login(你所建立的應用包名)/cache”下面,我們就可以看到我們所儲存的檔案了。

之後你再執行程式,就可以看到你之前填寫的帳號和密碼重新被回填到輸入框中。