一、项目开发
1、项目运行效果图
2、开发概要
主要功能SharedPreferences介绍,其是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出。
SharedPreferences数据的四种操作模式
- Context.MODE_PRIVATE
- Context.MODE_APPEND
- Context.MODE_WORLD_READABLE
- Context.MODE_WORLD_WRITEABLE
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
本项目中利用的是Context.MODE_PRIVATE模式,项目运行初始化是默认的记住密码状态,当勾选自动登录的时候记住密码会自动勾选,当以记住密码的状态正确登录过一次之后,系统会记住密码,将数据信息存入Android系统,ShredPreferences中的信息以XML文件的形式保存在 /data/data/cn.edu.bzu.aminiTwitter/userInfo目录下。当系统以自动登录状态正确登录过一次之后,那么系统下一次登录就会自动调取数据进入ShowActivity.xml中。
二、开发Android-SharedPreferences程序讲解
1、项目文件如下:
2、项目开发步骤
1、新建一个项目名字为aminiTitter,在布局文件activity_main.xml中设置文件布局,主要代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background_login"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<RelativeLayout
android:id="@+id/login_div"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dip"
android:background="@drawable/background_login_div_bg"
android:padding="2dp">
<TextView
android:id="@+id/tvUserName"
style="@style/normalText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="5dp"
android:text="@string/tvUserName" />
//用户名
<EditText
android:id="@+id/etName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tvUserName"
android:hint="@string/tvUser_hint"
android:background="@drawable/background_login_div_bg"
android:inputType="text"
android:singleLine="true" >
</EditText>
<TextView
android:id="@+id/tvPasswordName"
style="@style/normalText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/etName"
android:layout_below="@+id/etName"
android:layout_marginTop="5dp"
android:text="@string/tvPasswordName" />
//密码
<EditText
android:id="@+id/etPassword"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tvPasswordName"
android:layout_below="@+id/tvPasswordName"
android:ems="10"
android:inputType="textPassword"
android:background="@drawable/background_login_div_bg"
android:password="true"
android:singleLine="true" />
//登录事件
<Button
android:id="@+id/btnName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/etPassword"
android:layout_below="@+id/etPassword"
android:layout_marginTop="22dp"
android:onClick="btnClick"
android:background="@drawable/background_login"
android:text="@string/btnName" />
//多选框布局
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/btnName"
android:layout_alignLeft="@+id/etPassword"
android:orientation="horizontal">
//记住密码
<CheckBox
android:id="@+id/cbJiYi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cdJiYi" />
//自动登录
<CheckBox
android:id="@+id/cbZiDongDengLu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cbZiDongDengLu" />
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/tvTiShiName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="15dp"
android:text="@string/tvTiShiName"
android:textColor="#888"
android:textColorLink="#FF0066CC" />
<ImageView
android:id="@+id/dog_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:src="@drawable/dog" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/dog_logo"
android:layout_toLeftOf="@+id/dog_logo"
android:paddingBottom="8dp"
android:src="@drawable/bg" />
</RelativeLayout>
</LinearLayout>
文本文件string.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">aminiTwitter</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="tvUserName">账号:</string>
<string name="tvUser_hint">Email或手机号</string>
<string name="tvPasswordName">密码:</string>
<string name="btnName">登陆</string>
<string name="tvTiShiName">没有账号?<a href="#" nce_href="#">注册</a></string>
<string name="cdJiYi">记住密码</string>
<string name="cbZiDongDengLu">自动登录</string>
<string name="tvChengGong">登录成功!</string>
<string name="btnFanHui">点击返回</string>
<string name="title_activity_show">MainActivity</string>
</resources>
注意: 册上可以写连接的地址。
布局文件background_login_div_bg.xml和background_login.xml文件代码部分如下:
background_login_div_bg.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#55FFFFFF"/>
<corners
android:topLeftRadius="10dp"
android:topRightRadius="10dp"
android:bottomRightRadius="10dp"
android:bottomLeftRadius="10dp"/>
</shape>
background_login.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:startColor="#FFACDAE5"
android:endColor="#FF72CAE1"
android:angle="45"
/>
</shape>
2、重点来啦,主要代码在MainActivity.xml文件中,那么代码部分如下:
package cn.edu.bzu.aminitwitter;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private CheckBox cbJiYi;
private CheckBox cbZiDongDengLu;
private EditText etName,etPassword;
private SharedPreferences sharedPreferences;
private Button btnClick;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
findById();
//设置默认记住密码的状态
if(sharedPreferences.getBoolean("cbJiYi", true)){
cbJiYi.setChecked(true);
etName.setText(sharedPreferences.getString("etName", ""));
etPassword.setText(sharedPreferences.getString("etPassword", ""));
}
//判断自动登陆多选框的状态
if(sharedPreferences.getBoolean("cbcbZiDongDengLu", false)){
//设置默认自动登陆的状态
cbZiDongDengLu.setChecked(true);
//跳转界面
Intent intent = new Intent(MainActivity.this,ShowActivity.class);
startActivity(intent);
}
//监听自动登陆多选框事件
cbZiDongDengLu.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(cbZiDongDengLu.isChecked()){
//勾选事件
cbJiYi.setChecked(true);
sharedPreferences.edit().putBoolean("cbZiDongDengLu", true).commit();
}else{
sharedPreferences.edit().putBoolean("cbZiDongDengLu", false).commit();
}
}
});
}
private void findById() {
// TODO Auto-generated method stub
cbJiYi=(CheckBox) findViewById(R.id.cbJiYi);
cbZiDongDengLu=(CheckBox) findViewById(R.id.cbZiDongDengLu);
etName=(EditText) findViewById(R.id.etName);
etPassword=(EditText) findViewById(R.id.etPassword);
btnClick=(Button) findViewById(R.id.btnName);
//创建shareaPreferences对象用来存、取数据,文件名userInfo;
sharedPreferences=this.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void btnClick(View view){
if(etName.getText().toString().equals("abc") && etPassword.getText().toString().equals("aaa")){
//如果选中记住密码
if(cbJiYi.isChecked()){
// sharedPreferences.edit().putBoolean("ISCHECK", true).commit();
//存入
Editor editor=sharedPreferences.edit();
editor.putString("etName", etName.getText().toString());
editor.putString("etPassword", etPassword.getText().toString());
editor.commit();
//取出
String etName=sharedPreferences.getString("etName", "");
String etPassword=sharedPreferences.getString("etPassword", "");
Log.d("MainActivity", "etName="+etName+"\netPassword="+etPassword+"\n");
Toast.makeText(MainActivity.this, "记住用户名和密码", Toast.LENGTH_LONG).show();
}else {
//如果没选中记住密码
Toast.makeText(this, "没有记住用户名和密码", Toast.LENGTH_LONG).show();
etName.setText("");
etPassword.setText("");
// sharedPreferences.edit().putBoolean("ISCHECK", false).commit();
}
Intent intent=new Intent(MainActivity.this, ShowActivity.class);
startActivity(intent);
//finish();
if(cbJiYi.isChecked() && cbZiDongDengLu.isChecked()){
startActivity(intent);
//finish();
}
}else{
Toast.makeText(MainActivity.this, "登录失败!", Toast.LENGTH_LONG).show();
}
}
}
主要是数据的存入和取出利用,设置多选框的默认状态的记住密码、自动登录的监听事件,默认状态是记住密码,不自动登录,在btnClick实践中判断etName、etPasswprd是否为空,然后再确定执行语句,验证密码后在确定是否执行跳转,跳转到activity_show.xml中。
3、新建另一个简单的xml文件,activity_show.xml代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#5C4033"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ShowActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/tvChengGong"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tvChengGong"
android:textColor="#00FF7F"
android:textSize="30sp" />
//返回
<Button
android:id="@+id/btnBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="Recover"
android:background="#00FF00"
android:text="@string/btnFanHui" />
</LinearLayout>
</RelativeLayout>
4、修改ShowActivity.java文件,代码部分如下:
package cn.edu.bzu.aminitwitter;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class ShowActivity extends Activity {
private Button btnBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除标题
<h1> this.requestWindowFeature(Window.FEATURE_NO_TITLE);</h1> setContentView(R.layout.activity_show);
btnBack=(Button) findViewById(R.id.btnBack);
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
//返回
finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.show, menu);
return true;
}
}
第二种简单方式:
public class LoginActivity extends Activity {
private EditText etUser,etPassword;//定义用户名和密码
private CheckBox cbRemember;//定义记住密码
private Button btnLogin;//登录按钮
private SharedPreferences mSpSettings=null;//声明一个sharedPreferences用于保存数据
private static final String PREPS_NAME="NamePwd";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
setTitle("登录界面");
findById();//获取控件
setListener();//绑定事件
getData();
}
private void setListener() {
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(etUser.getText().toString().equals("zsh")&&etPassword.getText().toString().equals("123")){
//判断是否记住密码,复选框是否选中
if(cbRemember.isChecked()){
mSpSettings=getSharedPreferences(PREPS_NAME, MODE_PRIVATE);
Editor edit=mSpSettings.edit();//得到Editor对象
edit.putBoolean("isKeep", true);//记录保存标记
edit.putString("username", etUser.getText().toString());//记录用户名
edit.putString("password", etPassword.getText().toString());//记录密码
edit.commit();//**提交
}else {
mSpSettings=getSharedPreferences(PREPS_NAME, MODE_PRIVATE);
Editor edit=mSpSettings.edit();
edit.putBoolean("isKeep", true);//保存的文件名isKeep
edit.putString("username", "");
edit.putString("password", "");
edit.commit();
}
//跳转
Intent intent=new Intent(LoginActivity.this, LoginShowActivity.class);
startActivity(intent);
}else{
Toast.makeText(LoginActivity.this, "密码或者用户名错误", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onResume() {
super.onResume();
getData();//在界面显示数据之前得到之前存储的数据
}
private void getData() {
mSpSettings=getSharedPreferences(PREPS_NAME, MODE_PRIVATE);
if(mSpSettings.getBoolean("isKeep", false)){
//如果之前存储过,则显示在相应文本框内
etUser.setText(mSpSettings.getString("username", ""));
etPassword.setText(mSpSettings.getString("password", ""));
}else{//否则显示为空
etUser.setText("");
etPassword.setText("");
}
}
private void findById() {
etUser=(EditText) findViewById(R.id.etUser);
etPassword=(EditText) findViewById(R.id.etPassword);
cbRemember=(CheckBox) findViewById(R.id.cbRemember);
btnLogin=(Button) findViewById(R.id.btnLogin);
}
}
5、在调试过程中注意多给Android系统加大点缓存,有利于程序的调试。这个程序其实不太成熟,比如有写代码部分没有得到有力的简化。有不好的地方希望亲抽出时间发送消息哦,在下定感激不尽!