Android编程实现设计用户注册功能能

基于android的简单用户注册系统课程设计报告_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于android的简单用户注册系统课程设计报告
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩18页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
基于android的简单用户注册系统课程设计报告
下载积分:1000
内容提示:基于android的简单用户注册系统课程设计报告
文档格式:DOC|
浏览次数:165|
上传日期: 03:14:10|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
基于android的简单用户注册系统课程设计报告
关注微信公众号今天看啥 热点:
Android 实现登录界面和功能实例,android登录界面
& & & &最近一个android小程序需要登录功能,我简单实现了一下。现在记录下来也当做个笔记,同时也希望可以相互学习。所以,如果我的代码有问题,还各位请提出来。多谢了!
下面,就简述一下此实例的主要内容:
& & & & 输入用户名和密码 ,从本地文件userinfo.json中读取users。判断此用户名是否在users中,如果不在则加入users,每次退出Activity都使用AES算法加密users,然后保存到userinfo.json中。用户名下拉菜单是由PopupWindow
+ ListView 实现。
运行效果图:
主要的代码:
1、用户类User
package com.example.
import org.json.JSONE
import org.json.JSONO
import android.util.L
public class User {
private String mId;
private String mP
private static final String masterPassword = &FORYOU&; // AES加密算法的种子
private static final String JSON_ID = &user_id&;
private static final String JSON_PWD = &user_pwd&;
private static final String TAG = &User&;
public User(String id, String pwd) {
this.mId =
this.mPwd =
public User(JSONObject json) throws Exception {
if (json.has(JSON_ID)) {
String id = json.getString(JSON_ID);
String pwd = json.getString(JSON_PWD);
// 解密后存放
mId = AESUtils.decrypt(masterPassword, id);
mPwd = AESUtils.decrypt(masterPassword, pwd);
public JSONObject toJSON() throws Exception {
// 使用AES加密算法加密后保存
String id = AESUtils.encrypt(masterPassword, mId);
String pwd = AESUtils.encrypt(masterPassword, mPwd);
Log.i(TAG, &加密后:& + id + &
JSONObject json = new JSONObject();
json.put(JSON_ID, id);
json.put(JSON_PWD, pwd);
} catch (JSONException e) {
e.printStackTrace();
public String getId() {
return mId;
public String getPwd() {
2、保存和加载本地User列表
package com.example.
import java.io.BufferedR
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.IOE
import java.io.InputStreamR
import java.io.OutputS
import java.io.OutputStreamW
import java.io.W
import java.util.ArrayL
import org.json.JSONA
import org.json.JSONE
import org.json.JSONT
import android.content.C
import android.util.L
public class Utils {
private static final String FILENAME = &userinfo.json&; // 用户保存文件名
private static final String TAG = &Utils&;
/* 保存用户登录信息列表 */
public static void saveUserList(Context context, ArrayList&User& users)
throws Exception {
/* 保存 */
Log.i(TAG, &正在保存&);
Writer writer =
OutputStream out =
JSONArray array = new JSONArray();
for (User user : users) {
array.put(user.toJSON());
out = context.openFileOutput(FILENAME, Context.MODE_PRIVATE); // 覆盖
writer = new OutputStreamWriter(out);
Log.i(TAG, &json的值:& + array.toString());
writer.write(array.toString());
} finally {
if (writer != null)
writer.close();
/* 获取用户登录信息列表 */
public static ArrayList&User& getUserList(Context context) {
/* 加载 */
FileInputStream in =
ArrayList&User& users = new ArrayList&User&();
in = context.openFileInput(FILENAME);
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
StringBuilder jsonString = new StringBuilder();
JSONArray jsonArray = new JSONArray();
while ((line = reader.readLine()) != null) {
jsonString.append(line);
Log.i(TAG, jsonString.toString());
jsonArray = (JSONArray) new JSONTokener(jsonString.toString())
.nextValue(); // 把字符串转换成JSONArray对象
for (int i = 0; i & jsonArray.length(); i++) {
User user = new User(jsonArray.getJSONObject(i));
users.add(user);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
3、AES加密/解密
package com.example.
import java.security.SecureR
import javax.crypto.C
import javax.crypto.KeyG
import javax.crypto.SecretK
import javax.crypto.spec.IvParameterS
import javax.crypto.spec.SecretKeyS
public class AESUtils {
public static String encrypt(String seed, String cleartext)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
public static String decrypt(String seed, String encrypted)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance(&AES&);
SecureRandom sr = SecureRandom.getInstance(&SHA1PRNG&, &Crypto&);
sr.setSeed(seed);
kgen.init(128, sr);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, &AES&);
Cipher cipher = Cipher.getInstance(&AES&);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(
new byte[cipher.getBlockSize()]));
byte[] encrypted = cipher.doFinal(clear);
private static byte[] decrypt(byte[] raw, byte[] encrypted)
throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, &AES&);
Cipher cipher = Cipher.getInstance(&AES&);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(
new byte[cipher.getBlockSize()]));
byte[] decrypted = cipher.doFinal(encrypted);
private static String toHex(String txt) {
return toHex(txt.getBytes());
private static String fromHex(String hex) {
return new String(toByte(hex));
private static byte[] toByte(String hexString) {
int len = hexString.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i & i++)
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
16).byteValue();
private static String toHex(byte[] buf) {
if (buf == null)
return &&;
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i & buf. i++) {
appendHex(result, buf[i]);
return result.toString();
private final static String HEX = &ABCDEF&;
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b && 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
4、LoginActivity.java
package com.example.
import java.util.ArrayL
import android.app.A
import android.app.D
import android.graphics.drawable.ColorD
import android.os.B
import android.text.E
import android.text.TextW
import android.util.DisplayM
import android.util.L
import android.view.V
import android.view.ViewG
import android.view.W
import android.view.WindowM
import android.view.View.OnClickL
import android.view.ViewGroup.LayoutP
import android.view.animation.A
import android.view.animation.AnimationU
import android.widget.AdapterV
import android.widget.AdapterView.OnItemClickL
import android.widget.ArrayA
import android.widget.B
import android.widget.EditT
import android.widget.ImageV
import android.widget.LinearL
import android.widget.ListV
import android.widget.PopupW
import android.widget.PopupWindow.OnDismissL
import android.widget.TextV
import android.widget.T
public class LoginActivity extends Activity implements OnClickListener,
OnItemClickListener, OnDismissListener {
protected static final String TAG = &LoginActivity&;
private LinearLayout mLoginLinearL // 登录内容的容器
private LinearLayout mUserIdLinearL // 将下拉弹出窗口在此容器下方显示
private Animation mT // 位移动画
private Dialog mLoginingD // 显示正在登录的Dialog
private EditText mIdEditT // 登录ID编辑框
private EditText mPwdEditT // 登录密码编辑框
private ImageView mMoreU // 下拉图标
private Button mLoginB // 登录按钮
private ImageView mLoginMoreUserV // 弹出下拉弹出窗的按钮
private String mIdS
private String mPwdS
private ArrayList&User& mU // 用户列表
private ListView mUserIdListV // 下拉弹出窗显示的ListView对象
private MyAapter mA // ListView的监听器
private PopupWindow mP // 下拉弹出窗
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
setListener();
mLoginLinearLayout.startAnimation(mTranslate); // Y轴水平移动
/* 获取已经保存好的用户密码 */
mUsers = Utils.getUserList(LoginActivity.this);
if (mUsers.size() & 0) {
/* 将列表中的第一个user显示在编辑框 */
mIdEditText.setText(mUsers.get(0).getId());
mPwdEditText.setText(mUsers.get(0).getPwd());
LinearLayout parent = (LinearLayout) getLayoutInflater().inflate(
R.layout.userifo_listview, null);
mUserIdListView = (ListView) parent.findViewById(android.R.id.list);
parent.removeView(mUserIdListView); // 必须脱离父子关系,不然会报错
mUserIdListView.setOnItemClickListener(this); // 设置点击事
mAdapter = new MyAapter(mUsers);
mUserIdListView.setAdapter(mAdapter);
/* ListView的适配器 */
class MyAapter extends ArrayAdapter&User& {
public MyAapter(ArrayList&User& users) {
super(LoginActivity.this, 0, users);
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(
R.layout.listview_item, null);
TextView userIdText = (TextView) convertView
.findViewById(R.id.listview_userid);
userIdText.setText(getItem(position).getId());
ImageView deleteUser = (ImageView) convertView
.findViewById(R.id.login_delete_user);
deleteUser.setOnClickListener(new OnClickListener() {
// 点击删除deleteUser时,在mUsers中删除选中的元素
public void onClick(View v) {
if (getItem(position).getId().equals(mIdString)) {
// 如果要删除的用户Id和Id编辑框当前值相等,则清空
mIdString = &&;
mPwdString = &&;
mIdEditText.setText(mIdString);
mPwdEditText.setText(mPwdString);
mUsers.remove(getItem(position));
mAdapter.notifyDataSetChanged(); // 更新ListView
return convertV
private void setListener() {
mIdEditText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
mIdString = s.toString();
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
public void afterTextChanged(Editable s) {
mPwdEditText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
mPwdString = s.toString();
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
public void afterTextChanged(Editable s) {
mLoginButton.setOnClickListener(this);
mLoginMoreUserView.setOnClickListener(this);
private void initView() {
mIdEditText = (EditText) findViewById(R.id.login_edtId);
mPwdEditText = (EditText) findViewById(R.id.login_edtPwd);
mMoreUser = (ImageView) findViewById(R.id.login_more_user);
mLoginButton = (Button) findViewById(R.id.login_btnLogin);
mLoginMoreUserView = (ImageView) findViewById(R.id.login_more_user);
mLoginLinearLayout = (LinearLayout) findViewById(R.id.login_linearLayout);
mUserIdLinearLayout = (LinearLayout) findViewById(R.id.userId_LinearLayout);
mTranslate = AnimationUtils.loadAnimation(this, R.anim.my_translate); // 初始化动画对象
initLoginingDlg();
public void initPop() {
int width = mUserIdLinearLayout.getWidth() - 4;
int height = LayoutParams.WRAP_CONTENT;
mPop = new PopupWindow(mUserIdListView, width, height, true);
mPop.setOnDismissListener(this);// 设置弹出窗口消失时监听器
// 注意要加这句代码,点击弹出窗口其它区域才会让窗口消失
mPop.setBackgroundDrawable(new ColorDrawable(0xffffffff));
/* 初始化正在登录对话框 */
private void initLoginingDlg() {
mLoginingDlg = new Dialog(this, R.style.loginingDlg);
mLoginingDlg.setContentView(R.layout.logining_dlg);
Window window = mLoginingDlg.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
// 获取和mLoginingDlg关联的当前窗口的属性,从而设置它在屏幕中显示的位置
// 获取屏幕的高宽
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int cxScreen = dm.widthP
int cyScreen = dm.heightP
int height = (int) getResources().getDimension(
R.dimen.loginingdlg_height);// 高42dp
int lrMargin = (int) getResources().getDimension(
R.dimen.loginingdlg_lr_margin); // 左右边沿10dp
int topMargin = (int) getResources().getDimension(
R.dimen.loginingdlg_top_margin); // 上沿20dp
params.y = (-(cyScreen - height) / 2) + topM // -199
/* 对话框默认位置在屏幕中心,所以x,y表示此控件到&屏幕中心&的偏移量 */
params.width = cxS
params.height =
// width,height表示mLoginingDlg的实际大小
mLoginingDlg.setCanceledOnTouchOutside(true); // 设置点击Dialog外部任意区域关闭Dialog
/* 显示正在登录对话框 */
private void showLoginingDlg() {
if (mLoginingDlg != null)
mLoginingDlg.show();
/* 关闭正在登录对话框 */
private void closeLoginingDlg() {
if (mLoginingDlg != null && mLoginingDlg.isShowing())
mLoginingDlg.dismiss();
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_btnLogin:
// 启动登录
showLoginingDlg(); // 显示&正在登录&对话框,因为此Demo没有登录到web服务器,所以效果可能看不出.可以结合情况使用
Log.i(TAG, mIdString + &
& + mPwdString);
if (mIdString == null || mIdString.equals(&&)) { // 账号为空时
Toast.makeText(LoginActivity.this, &请输入账号&, Toast.LENGTH_SHORT)
} else if (mPwdString == null || mPwdString.equals(&&)) {// 密码为空时
Toast.makeText(LoginActivity.this, &请输入密码&, Toast.LENGTH_SHORT)
} else {// 账号和密码都不为空时
boolean mIsSave =
Log.i(TAG, &保存用户列表&);
for (User user : mUsers) { // 判断本地文档是否有此ID用户
if (user.getId().equals(mIdString)) {
if (mIsSave) { // 将新用户加入users
User user = new User(mIdString, mPwdString);
mUsers.add(user);
} catch (Exception e) {
e.printStackTrace();
closeLoginingDlg();// 关闭对话框
Toast.makeText(this, &登录成功&, Toast.LENGTH_SHORT).show();
case R.id.login_more_user: // 当点击下拉栏
if (mPop == null) {
initPop();
if (!mPop.isShowing() && mUsers.size() & 0) {
// Log.i(TAG, &切换为角向上图标&);
mMoreUser.setImageResource(R.drawable.login_more_down); // 切换图标
mPop.showAsDropDown(mUserIdLinearLayout, 2, 1); // 显示弹出窗口
public void onItemClick(AdapterView&?& parent, View view, int position,
long id) {
mIdEditText.setText(mUsers.get(position).getId());
mPwdEditText.setText(mUsers.get(position).getPwd());
mPop.dismiss();
/* PopupWindow对象dismiss时的事件 */
public void onDismiss() {
// Log.i(TAG, &切换为角向下图标&);
mMoreUser.setImageResource(R.drawable.login_more_up);
/* 退出此Activity时保存users */
public void onPause() {
super.onPause();
Utils.saveUserList(LoginActivity.this, mUsers);
} catch (Exception e) {
e.printStackTrace();
其他一些布局和资源配置我就不详细列出了,想看的可以下载 &&&源码
安装的时候是没有功能简介的,安装的过程是android系统控制的,只会读取你程序中声明的权限..你说的是安装按成第一次运行吧?如果这样的话就存个sharePreference吧.每次启动的时候读取下,第一次肯定读不到就显示简介界面,然后保存sharePreference,以后就不会显示了..这个很简单吧
可以用SharedPreferences存贮你的账户信息,也可以用数据库,这里你随便。思路可以是这样:写一个Welcome界面,在onCreate方法中判断,根据条件来跳转到对应的活动。比如没有设置checked,则启动登录界面LoadA设置了的话,读取配置信息或是数据库中存有的用户名和密码来自动登录,验证成功后跳转到应用功能界面。
相关搜索:
相关阅读:
相关频道:
Android教程最近更新使用Bmob后端云实现用户注册登录的功能
今天给大家介绍一下使用Bmob后端云搭建自己的网上服务器,以后再也不要求着搞服务器的了,自己一个人搞定一个客户端。因为此处篇幅比较多,所以我决定分两篇博客进行讲解,欢迎看下篇 智能厨房重构-使用Bmob后端云实现朋友圈的功能。
1. 环境配置
1.1 服务器配置
首先你需要注册一个Bmob的账号,进入官网即可,注册一个自己的App,如何在后台建立属于自己的表,基本都是傻瓜式建表了,不需要使用SQL语言,来看一下我建的表:
表搭建好了,服务器这边就完事了,就是如此简单。
1.2 客户端环境配置
搞完服务器,接下来就需要将bmob集成到我们的客户端中来了,其实我也是官网文档的搬运工,我就将最主要的步骤介绍一下:
去官网上面下载这两个JAR包,然后再build gradle中添加两个依赖,官网文档中还有直接导入的方式,给个链接/data/Android/a_faststart/doc/index.html初始化BmobSDK,都是比较简单的。
1.3 基本的数据类型和函数
目前为止,Bmob支持的数据类型:String、Integer、Float、Short、Byte、Double、Character、Boolean、Object、Array。
同时也支持BmobObject、BmobDate、BmobGeoPoint、BmobFile特有的数据类型。
添加数据使用BmobObject对象的save方法,就可以将当前对象的内容保存到Bmob服务端。
例如,你现在要保存一条游戏分数的记录,代码如下:vcD4NCjxwcmUgY2xhc3M9"brush:">
BmobQuery query = new BmobQuery();
query.getObject(&a203eba875&, new QueryListener() {
public void done(GameScore object, BmobException e) {
if(e==null){
//获得playerName的信息
object.getPlayerName();
//获得数据的objectId信息
object.getObjectId();
//获得createdAt数据创建时间(注意是:createdAt,不是createAt)
object.getCreatedAt();
Log.i(&bmob&,&失败:&+e.getMessage()+&,&+e.getErrorCode());
更新一个对象也是非常简单。例如:将GameScore表中objectId为0c6db13c的游戏分数修改为77.
GameScore gameScore = new GameScore();
gameScore.setScore(77);
gameScore.update(&0c6db13c&, new UpdateListener() {
public void done(BmobException e) {
if(e==null){
Log.i(&bmob&,&更新成功&);
Log.i(&bmob&,&更新失败:&+e.getMessage()+&,&+e.getErrorCode());
函数都比较简单好用,如果想要了解更多,请直接看官网文档。
现在服务器和客户端的环境都配置好,现在我们可以开始实战了。我们要实现的注册和登录的功能,首先来看一下流程
2.1 建立实体对象
使用Bmob,必须遵守的一个规则就是,你的实体对象名必须和表名相同,表中的每一个列都对应一个属性,必须继承BmobObject这个类,这一点很不好,假如和ActiveAndroid连用的话,就冲突了,因为中不能多重继承,比如上面的用户表对应实体类就是:
public class User extends BmobObject implements Serializable{
BmobFile P
public String getNumber() {
public void setNumber(String number) {
//手机号码
public String getName() {
public void setName(String name) {
public BmobFile getPhoto() {
public void setPhoto(BmobFile photo) {
public String getPassword() {
public void setPassword(String password) {
Password =
public User() {
2.2 建立UserModel和服务器进行数据交互
* 作者:GXL on
* 博客: http://blog.csdn.net/u
* 作用:用户信息Model
public class UserModel implements UserModelImpl {
private final String LOGINUSER = &loginuser&;
* 用户登录验证
* @param phone
* @param passoword
* @param listener
public void getUser(String phone, String passoword, final FoodModelImpl.BaseListener listener) {
BmobQuery query = new BmobQuery();
query.addWhereEqualTo(&Number&, phone);
query.addWhereEqualTo(&Password&, passoword);
query.setLimit(1);
query.findObjects(BaseApplication.getmContext(), new FindListener() {
public void onSuccess(List object) {
if (object != null && object.size() != 0) {
SPUtils.put(BaseApplication.getmContext(), LOGINUSER, object.get(0));
listener.getSuccess(object.get(0));
listener.getFailure();
public void onError(int code, String msg) {
* 根据objectId获取User
* @param objectId
* @param listener
public void getUser(String objectId, final FoodModelImpl.BaseListener listener) {
BmobQuery query = new BmobQuery();
query.addWhereEqualTo(&objectId&, objectId);
query.setLimit(1);
query.findObjects(BaseApplication.getmContext(), new FindListener() {
public void onSuccess(List object) {
if (object != null && object.size() != 0) {
SPUtils.put(BaseApplication.getmContext(), LOGINUSER, object.get(0));
listener.getSuccess(object.get(0));
listener.getFailure();
public void onError(int code, String msg) {
* 更换用户的头像
* @param path
* @param listener
public void updateUserPhoto(String path, final String objectId, final FoodModelImpl.BaseListener listener) {
final BmobFile bmobFile = new BmobFile(new File(path));
bmobFile.upload(BaseApplication.getmContext(), new UploadFileListener() {
public void onSuccess() {
final User user = new User();
user.setPhoto(bmobFile);
user.update(BaseApplication.getmContext(), objectId, new UpdateListener() {
public void onSuccess() {
listener.getSuccess(user);
public void onFailure(int i, String s) {
listener.getFailure();
public void onFailure(int i, String s) {
listener.getFailure();
* 判断当前用户是否登录
public boolean isLogin() {
List list = new Select().from(UserLocal.class).execute();
if (list.size() != 0) {
* 将当前登录的对象保持到中
* @param userLocal
public void putUserLocal(UserLocal userLocal) {
new Delete().from(UserLocal.class).execute();
userLocal.save();
* 获取当前登录的对象
public UserLocal getUserLocal() {
return new Select().from(UserLocal.class).executeSingle();
* 注册功能
* @param user
public void onRegister(User user, final FoodModelImpl.BaseListener listener) {
user.save(BaseApplication.getmContext(), new SaveListener() {
public void onSuccess() {
ToastUtils.showLong(BaseApplication.getmContext(), &注册成功&);
listener.getSuccess(null);
public void onFailure(int i, String s) {
ToastUtils.showLong(BaseApplication.getmContext(), &注册失败&);
listener.getFailure();
* 判断当前手机号码是否注册
* @param phone
* @param listener
public void isPhoneRegister(String phone, final FoodModelImpl.BaseListener listener) {
BmobQuery query = new BmobQuery();
query.addWhereEqualTo(&Number&, phone);
query.setLimit(1);
query.findObjects(BaseApplication.getmContext(), new FindListener() {
public void onSuccess(List object) {
if (object != null && object.size() != 0) {
listener.getSuccess(object.get(0));
listener.getFailure();
public void onError(int code, String msg) {
所有和服务器的数据请求和提交都在上面了,都很简单,都是利用了上面的函数。
2.3 使用效果
详细的项目代码地址:,如果决定效果还可以,请点个赞支持一下,多谢了。

我要回帖

更多关于 用户注册功能描述 的文章

 

随机推荐