失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android实现登录界面和功能实例

Android实现登录界面和功能实例

时间:2024-07-12 12:38:45

相关推荐

Android实现登录界面和功能实例

最近一个android小程序需要登录功能,我简单实现了一下。现在记录下来也当做个笔记,同时也希望可以相互学习。所以,如果我的代码有问题,还各位请提出来。多谢了!

下面,就简述一下此实例的主要内容:

输入用户名和密码 ,从本地文件userinfo.json中读取users。判断此用户名是否在users中,如果不在则加入users,每次退出Activity都使用AES算法加密users,然后保存到userinfo.json中。用户名下拉菜单是由PopupWindow + ListView 实现。

运行效果图:

主要的代码:

1、用户类User

view sourceprint?01.packagecom.example.logindemo;02.03.importorg.json.JSONException;04.importorg.json.JSONObject;05.importandroid.util.Log;06.07.publicclassUser {08.privateString mId;09.privateString mPwd;10.privatestaticfinalString masterPass<Aclass=keylink href="/edu/ebg/"target=_blank>word</A> ="FORYOU"; // AES加密算法的种子11.privatestaticfinalString JSON_ID ="user_id";12.privatestaticfinalString JSON_PWD ="user_pwd";13.privatestaticfinalString TAG ="User";14.15.publicUser(String id, String pwd) {16.this.mId = id;17.this.mPwd = pwd;18.}19.20.publicUser(JSONObject json)throwsException {21.if(json.has(JSON_ID)) {22.String id = json.getString(JSON_ID);23.String pwd = json.getString(JSON_PWD);24.// 解密后存放25.mId = AESUtils.decrypt(masterPass<Aclass=keylink href="/edu/ebg/"target=_blank>word</A>, id);26.mPwd = AESUtils.decrypt(masterPassword, pwd);27.}28.}29.30.publicJSONObject toJSON()throwsException {31.// 使用AES加密算法加密后保存32.String id = AESUtils.encrypt(masterPassword, mId);33.String pwd = AESUtils.encrypt(masterPassword, mPwd);34.Log.i(TAG,"加密后:"+ id +" "+ pwd);35.JSONObject json =newJSONObject();36.try{37.json.put(JSON_ID, id);38.json.put(JSON_PWD, pwd);39.}catch(JSONException e) {40.e.printStackTrace();41.}42.returnjson;43.}44.45.publicString getId() {46.returnmId;47.}48.49.publicString getPwd() {50.returnmPwd;51.}52.}

2、保存和加载本地User列表

view sourceprint?01.packagecom.example.logindemo;02.03.importjava.io.BufferedReader;04.importjava.io.FileInputStream;05.importjava.io.FileNotFoundException;06.importjava.io.IOException;07.importjava.io.InputStreamReader;08.importjava.io.OutputStream;09.importjava.io.OutputStreamWriter;10.importjava.io.Writer;11.importjava.util.ArrayList;12.importorg.json.JSONArray;13.importorg.json.JSONException;14.importorg.json.JSONTokener;15.16.importandroid.content.Context;17.importandroid.util.Log;18.19.publicclassUtils {20.21.privatestaticfinalString FILENAME ="userinfo.json";// 用户保存文件名22.privatestaticfinalString TAG ="Utils";23.24./* 保存用户登录信息列表 */25.publicstaticvoidsaveUserList(Context context, ArrayList<User> users)26.throwsException {27./* 保存 */28.Log.i(TAG,"正在保存");29.Writer writer =null;30.OutputStream out =null;31.JSONArray array =newJSONArray();32.for(User user : users) {33.array.put(user.toJSON());34.}35.try{36.out = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);// 覆盖37.writer =newOutputStreamWriter(out);38.Log.i(TAG,"json的值:"+ array.toString());39.writer.write(array.toString());40.}finally{41.if(writer !=null)42.writer.close();43.}44.45.}46.47./* 获取用户登录信息列表 */48.publicstaticArrayList<User> getUserList(Context context) {49./* 加载 */50.FileInputStream in =null;51.ArrayList<User> users =newArrayList<User>();52.try{53.54.in = context.openFileInput(FILENAME);55.BufferedReader reader =newBufferedReader(56.newInputStreamReader(in));57.StringBuilder jsonString =newStringBuilder();58.JSONArray jsonArray =newJSONArray();59.String line;60.while((line = reader.readLine()) !=null) {61.jsonString.append(line);62.}63.Log.i(TAG, jsonString.toString());64.jsonArray = (JSONArray)newJSONTokener(jsonString.toString())65..nextValue();// 把字符串转换成JSONArray对象66.for(inti =0; i < jsonArray.length(); i++) {67.User user =newUser(jsonArray.getJSONObject(i));68.users.add(user);69.}70.71.}catch(FileNotFoundException e) {72.e.printStackTrace();73.}catch(IOException e) {74.e.printStackTrace();75.}catch(JSONException e) {76.e.printStackTrace();77.}catch(Exception e) {78.e.printStackTrace();79.}80.81.returnusers;82.}83.}

3、AES加密/解密

view sourceprint?01.packagecom.example.logindemo;02.03.04.importjava.security.SecureRandom;05.06.importjavax.crypto.Cipher;07.importjavax.crypto.KeyGenerator;08.importjavax.crypto.SecretKey;09.importjavax.crypto.spec.IvParameterSpec;10.importjavax.crypto.spec.SecretKeySpec;11.12.publicclassAESUtils {13.publicstaticString encrypt(String seed, String cleartext)14.throwsException {15.byte[] rawKey = getRawKey(seed.getBytes());16.byte[] result = encrypt(rawKey, cleartext.getBytes());17.returntoHex(result);18.}19.20.publicstaticString decrypt(String seed, String encrypted)21.throwsException {22.byte[] rawKey = getRawKey(seed.getBytes());23.byte[] enc = toByte(encrypted);24.byte[] result = decrypt(rawKey, enc);25.returnnewString(result);26.}27.28.privatestaticbyte[] getRawKey(byte[] seed)throwsException {29.KeyGenerator kgen = KeyGenerator.getInstance("AES");30.SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto");31.sr.setSeed(seed);32.kgen.init(128, sr);33.SecretKey skey = kgen.generateKey();34.byte[] raw = skey.getEncoded();35.returnraw;36.}37.38.privatestaticbyte[] encrypt(byte[] raw,byte[] clear)throwsException {39.SecretKeySpec skeySpec =newSecretKeySpec(raw,"AES");40.Cipher cipher = Cipher.getInstance("AES");41.cipher.init(Cipher.ENCRYPT_MODE, skeySpec,newIvParameterSpec(42.newbyte[cipher.getBlockSize()]));43.byte[] encrypted = cipher.doFinal(clear);44.returnencrypted;45.}46.47.privatestaticbyte[] decrypt(byte[] raw,byte[] encrypted)48.throwsException {49.SecretKeySpec skeySpec =newSecretKeySpec(raw,"AES");50.Cipher cipher = Cipher.getInstance("AES");51.cipher.init(Cipher.DECRYPT_MODE, skeySpec,newIvParameterSpec(52.newbyte[cipher.getBlockSize()]));53.byte[] decrypted = cipher.doFinal(encrypted);54.returndecrypted;55.}56.57.privatestaticString toHex(String txt) {58.returntoHex(txt.getBytes());59.}60.61.privatestaticString fromHex(String hex) {62.returnnewString(toByte(hex));63.}64.65.privatestaticbyte[] toByte(String hexString) {66.intlen = hexString.length() /2;67.byte[] result =newbyte[len];68.for(inti =0; i < len; i++)69.result[i] = Integer.valueOf(hexString.substring(2* i,2* i +2),70.16).byteValue();71.returnresult;72.}73.74.privatestaticString toHex(byte[] buf) {75.if(buf ==null)76.return"";77.StringBuffer result =newStringBuffer(2* buf.length);78.for(inti =0; i < buf.length; i++) {79.appendHex(result, buf[i]);80.}81.returnresult.toString();82.}83.84.privatefinalstaticString HEX ="0123456789ABCDEF";85.86.privatestaticvoidappendHex(StringBuffer sb,byteb) {87.sb.append(HEX.charAt((b >>4) &0x0f)).append(HEX.charAt(b &0x0f));88.}89.}

4、LoginActivity.java

view sourceprint?001.packagecom.example.logindemo;002.003.importjava.util.ArrayList;004.005.importandroid.app.Activity;006.importandroid.app.Dialog;007.importandroid.graphics.drawable.ColorDrawable;008.importandroid.os.Bundle;009.importandroid.text.Editable;010.importandroid.text.TextWatcher;011.importandroid.util.DisplayMetrics;012.importandroid.util.Log;013.importandroid.view.View;014.importandroid.view.ViewGroup;015.importandroid.view.Window;016.importandroid.view.WindowManager;017.importandroid.view.View.OnClickListener;018.importandroid.view.ViewGroup.LayoutParams;019.importandroid.view.animation.Animation;020.importandroid.view.animation.AnimationUtils;021.importandroid.widget.AdapterView;022.importandroid.widget.AdapterView.OnItemClickListener;023.importandroid.widget.ArrayAdapter;024.importandroid.widget.Button;025.importandroid.widget.EditText;026.importandroid.widget.ImageView;027.importandroid.widget.LinearLayout;028.importandroid.widget.ListView;029.importandroid.widget.PopupWindow;030.importandroid.widget.PopupWindow.OnDismissListener;031.importandroid.widget.TextView;032.importandroid.widget.Toast;033.034.publicclassLoginActivityextendsActivityimplementsOnClickListener,035.OnItemClickListener, OnDismissListener {036.protectedstaticfinalString TAG ="LoginActivity";037.privateLinearLayout mLoginLinearLayout;// 登录内容的容器038.privateLinearLayout mUserIdLinearLayout;// 将下拉弹出窗口在此容器下方显示039.privateAnimation mTranslate;// 位移动画040.privateDialog mLoginingDlg;// 显示正在登录的Dialog041.privateEditText mIdEditText;// 登录ID编辑框042.privateEditText mPwdEditText;// 登录密码编辑框043.privateImageView mMoreUser;// 下拉图标044.privateButton mLoginButton;// 登录按钮045.privateImageView mLoginMoreUserView;// 弹出下拉弹出窗的按钮046.privateString mIdString;047.privateString mPwdString;048.privateArrayList<User> mUsers;// 用户列表049.privateListView mUserIdListView;// 下拉弹出窗显示的ListView对象050.privateMyAapter mAdapter;// ListView的监听器051.privatePopupWindow mPop;// 下拉弹出窗052.053.@Override054.publicvoidonCreate(Bundle savedInstanceState) {055.super.onCreate(savedInstanceState);056.setContentView(R.layout.activity_login);057.initView();058.setListener();059.mLoginLinearLayout.startAnimation(mTranslate);// Y轴水平移动060.061./* 获取已经保存好的用户密码 */062.mUsers = Utils.getUserList(LoginActivity.this);063.064.if(mUsers.size() >0) {065./* 将列表中的第一个user显示在编辑框 */066.mIdEditText.setText(mUsers.get(0).getId());067.mPwdEditText.setText(mUsers.get(0).getPwd());068.}069.070.LinearLayout parent = (LinearLayout) getLayoutInflater().inflate(071.R.layout.userifo_listview,null);072.mUserIdListView = (ListView) parent.findViewById(android.R.id.list);073.parent.removeView(mUserIdListView);// 必须脱离父子关系,不然会报错074.mUserIdListView.setOnItemClickListener(this);// 设置点击事075.mAdapter =newMyAapter(mUsers);076.mUserIdListView.setAdapter(mAdapter);077.078.}079.080./* ListView的适配器 */081.classMyAapterextendsArrayAdapter<User> {082.083.publicMyAapter(ArrayList<User> users) {084.super(LoginActivity.this,0, users);085.}086.087.publicView getView(finalintposition, View convertView,088.ViewGroup parent) {089.if(convertView ==null) {090.convertView = getLayoutInflater().inflate(091.R.layout.listview_item,null);092.}093.094.TextView userIdText = (TextView) convertView095..findViewById(R.id.listview_userid);096.userIdText.setText(getItem(position).getId());097.098.ImageView deleteUser = (ImageView) convertView099..findViewById(R.id.login_delete_user);100.deleteUser.setOnClickListener(newOnClickListener() {101.// 点击删除deleteUser时,在mUsers中删除选中的元素102.@Override103.publicvoidonClick(View v) {104.105.if(getItem(position).getId().equals(mIdString)) {106.// 如果要删除的用户Id和Id编辑框当前值相等,则清空107.mIdString ="";108.mPwdString ="";109.mIdEditText.setText(mIdString);110.mPwdEditText.setText(mPwdString);111.}112.mUsers.remove(getItem(position));113.mAdapter.notifyDataSetChanged();// 更新ListView114.}115.});116.returnconvertView;117.}118.119.}120.121.privatevoidsetListener() {122.mIdEditText.addTextChangedListener(newTextWatcher() {123.124.publicvoidonTextChanged(CharSequence s,intstart,intbefore,125.intcount) {126.mIdString = s.toString();127.}128.129.publicvoidbeforeTextChanged(CharSequence s,intstart,intcount,130.intafter) {131.}132.133.publicvoidafterTextChanged(Editable s) {134.}135.});136.mPwdEditText.addTextChangedListener(newTextWatcher() {137.138.publicvoidonTextChanged(CharSequence s,intstart,intbefore,139.intcount) {140.mPwdString = s.toString();141.}142.143.publicvoidbeforeTextChanged(CharSequence s,intstart,intcount,144.intafter) {145.}146.147.publicvoidafterTextChanged(Editable s) {148.}149.});150.mLoginButton.setOnClickListener(this);151.mLoginMoreUserView.setOnClickListener(this);152.}153.154.privatevoidinitView() {155.mIdEditText = (EditText) findViewById(R.id.login_edtId);156.mPwdEditText = (EditText) findViewById(R.id.login_edtPwd);157.mMoreUser = (ImageView) findViewById(R.id.login_more_user);158.mLoginButton = (Button) findViewById(R.id.login_btnLogin);159.mLoginMoreUserView = (ImageView) findViewById(R.id.login_more_user);160.mLoginLinearLayout = (LinearLayout) findViewById(R.id.login_linearLayout);161.mUserIdLinearLayout = (LinearLayout) findViewById(R.id.userId_LinearLayout);162.mTranslate = AnimationUtils.loadAnimation(this, R.anim.my_translate);// 初始化动画对象163.initLoginingDlg();164.}165.166.publicvoidinitPop() {167.intwidth = mUserIdLinearLayout.getWidth() -4;168.intheight = LayoutParams.WRAP_CONTENT;169.mPop =newPopupWindow(mUserIdListView, width, height,true);170.mPop.setOnDismissListener(this);// 设置弹出窗口消失时监听器171.172.// 注意要加这句代码,点击弹出窗口其它区域才会让窗口消失173.mPop.setBackgroundDrawable(newColorDrawable(0xffffffff));174.175.}176.177./* 初始化正在登录对话框 */178.privatevoidinitLoginingDlg() {179.180.mLoginingDlg =newDialog(this, R.style.loginingDlg);181.mLoginingDlg.setContentView(R.layout.logining_dlg);182.183.Window window = mLoginingDlg.getWindow();184.WindowManager.LayoutParams params = window.getAttributes();185.// 获取和mLoginingDlg关联的当前窗口的属性,从而设置它在屏幕中显示的位置186.187.// 获取屏幕的高宽188.DisplayMetrics dm =newDisplayMetrics();189.getWindowManager().getDefaultDisplay().getMetrics(dm);190.intcxScreen = dm.widthPixels;191.intcyScreen = dm.heightPixels;192.193.intheight = (int) getResources().getDimension(194.R.dimen.loginingdlg_height);// 高42dp195.intlrMargin = (int) getResources().getDimension(196.R.dimen.loginingdlg_lr_margin);// 左右边沿10dp197.inttopMargin = (int) getResources().getDimension(198.R.dimen.loginingdlg_top_margin);// 上沿20dp199.200.params.y = (-(cyScreen - height) /2) + topMargin;// -199201./* 对话框默认位置在屏幕中心,所以x,y表示此控件到"屏幕中心"的偏移量 */202.203.params.width = cxScreen;204.params.height = height;205.// width,height表示mLoginingDlg的实际大小206.207.mLoginingDlg.setCanceledOnTouchOutside(true);// 设置点击Dialog外部任意区域关闭Dialog208.}209.210./* 显示正在登录对话框 */211.privatevoidshowLoginingDlg() {212.if(mLoginingDlg !=null)213.mLoginingDlg.show();214.}215.216./* 关闭正在登录对话框 */217.privatevoidcloseLoginingDlg() {218.if(mLoginingDlg !=null&& mLoginingDlg.isShowing())219.mLoginingDlg.dismiss();220.}221.222.@Override223.publicvoidonClick(View v) {224.switch(v.getId()) {225.caseR.id.login_btnLogin:226.// 启动登录227.showLoginingDlg();// 显示"正在登录"对话框,因为此Demo没有登录到web服务器,所以效果可能看不出.可以结合情况使用228.Log.i(TAG, mIdString +" "+ mPwdString);229.if(mIdString ==null|| mIdString.equals("")) {// 账号为空时230.Toast.makeText(LoginActivity.this,"请输入账号", Toast.LENGTH_SHORT)231..show();232.}elseif(mPwdString ==null|| mPwdString.equals("")) {// 密码为空时233.Toast.makeText(LoginActivity.this,"请输入密码", Toast.LENGTH_SHORT)234..show();235.}else{// 账号和密码都不为空时236.booleanmIsSave =true;237.try{238.Log.i(TAG,"保存用户列表");239.for(User user : mUsers) {// 判断本地文档是否有此ID用户240.if(user.getId().equals(mIdString)) {241.mIsSave =false;242.break;243.}244.}245.if(mIsSave) {// 将新用户加入users246.User user =newUser(mIdString, mPwdString);247.mUsers.add(user);248.}249.250.}catch(Exception e) {251.e.printStackTrace();252.}253.closeLoginingDlg();// 关闭对话框254.Toast.makeText(this,"登录成功", Toast.LENGTH_SHORT).show();255.finish();256.}257.break;258.caseR.id.login_more_user:// 当点击下拉栏259.if(mPop ==null) {260.initPop();261.}262.if(!mPop.isShowing() && mUsers.size() >0) {263.// Log.i(TAG, "切换为角向上图标");264.mMoreUser.setImageResource(R.drawable.login_more_down);// 切换图标265.mPop.showAsDropDown(mUserIdLinearLayout,2,1);// 显示弹出窗口266.}267.break;268.default:269.break;270.}271.272.}273.274.@Override275.publicvoidonItemClick(AdapterView<?> parent, View view,intposition,276.longid) {277.mIdEditText.setText(mUsers.get(position).getId());278.mPwdEditText.setText(mUsers.get(position).getPwd());279.mPop.dismiss();280.}281.282./* PopupWindow对象dismiss时的事件 */283.@Override284.publicvoidonDismiss() {285.// Log.i(TAG, "切换为角向下图标");286.mMoreUser.setImageResource(R.drawable.login_more_up);287.}288.289./* 退出此Activity时保存users */290.@Override291.publicvoidonPause() {292.super.onPause();293.try{294.Utils.saveUserList(LoginActivity.this, mUsers);295.}catch(Exception e) {296.e.printStackTrace();297.}298.}299.

300.}

这是登录的Demo,所有东西都在里面呢

如果觉得《Android实现登录界面和功能实例》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。