一、项目开发

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系统加大点缓存,有利于程序的调试。这个程序其实不太成熟,比如有写代码部分没有得到有力的简化。有不好的地方希望亲抽出时间发送消息哦,在下定感激不尽!