Android學習系列(二): 儲存檔案到手機記憶體-模擬使用者登入儲存使用者資訊
阿新 • • 發佈:2019-02-08
今天要學習如何儲存檔案到手機記憶體中,具體思想如下:
(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”下面,我們就可以看到我們所儲存的檔案了。
之後你再執行程式,就可以看到你之前填寫的帳號和密碼重新被回填到輸入框中。