Android——用户登陆及用户名和密码的保存
Android——用户登陆及用户名和密码的保存
在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘记了,因此才会继续的学习Android,做出这个学习笔记。另外:由于在暑假的时候要开发Android项目,所以对于这些Android知识点也都要熟练的掌握。
目录
一、Android下的Junit测试
在实际开发中,开发android软件的过程需要不断地进行测试。而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性。
首先建立一个新的Android项目,这里我命名为:junit,然后编写AndroidManifest.xml文件,在里面添加uses-library和instrumentation两个属性,代码如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="lq.wangzhen.junit"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <instrumentation
8 android:name="android.test.InstrumentationTestRunner"
9 android:label="Tests for My App"
10 android:targetPackage="lq.wangzhen.junit" />
11
12 <uses-sdk
13 android:minSdkVersion="8"
14 android:targetSdkVersion="8" />
15
16 <application
17 android:allowBackup="true"
18 android:icon="@drawable/ic_launcher"
19 android:label="@string/app_name"
20 android:theme="@style/AppTheme" >
21 <uses-library android:name="android.test.runner" />
22
23 <activity
24 android:name="lq.wangzhen.junit.DemoActivity"
25 android:label="@string/app_name" >
26 <intent-filter>
27 <action android:name="android.intent.action.MAIN" />
28
29 <category android:name="android.intent.category.LAUNCHER" />
30 </intent-filter>
31 </activity>
32 </application>
33
34 </manifest>
其中在instrumentation中配置的targetPackage为测试类所在的包,我这里的包名为:lq.wangzhen.junit
编写完以上的代码以后,则可以在lq.wangzhen.junit包中定义一个类,这个类中包含一个Add方法,然后我们进行此方法的测试工作。代码如下:
Services.java
1 package lq.wangzhen.junit;
2
3 public class Service {
4
5 /**
6 * 提供一个方法,可以接收两个整型数据
7 * @param x
8 * @param y
9 * @return
10 */
11 public static int add(int x,int y){
12 return x+y;
13 }
14 }
下面编写测试类,此类命名为:TestAddService.java,此类必须要集成AndroidTestCase才能够作为测试类进行使用,代码如下:
1 package lq.wangzhen.junit;
2
3 import junit.framework.Assert;
4 import android.test.AndroidTestCase;
5
6 public class TestAddService extends AndroidTestCase {
7
8 public void testAdd(){
9 int result = Service.add(3, 5);
10 Assert.assertEquals(8, result);
11 }
12 }
以上就是一个简单的Android测试过程
二、登陆记录密码界面设计
完成完以上的测试功能后,下面我们来完成一个简单的用户登陆功能,现在要求用户输入用户名和密码,并选择是否保存用户名和密码,如果保存用户名和密码的话,我们要在ROM进行保存,然后在用户下次打开此软件时会自动的从文件中提取出对应的用户名和密码,填入到登陆框中,在本节中就先对界面进行一下设计,界面设计的xml文件如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:text="@string/username" />
11 <EditText
12 android:id="@+id/et_username"
13 android:layout_width="fill_parent"
14 android:layout_height="wrap_content"
15 android:hint="@string/username"
16 />
17
18 <TextView
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:text="@string/password" />
22 <EditText
23 android:id="@+id/et_password"
24 android:layout_width="fill_parent"
25 android:layout_height="wrap_content"
26 android:hint="@string/password"
27 android:inputType="textPassword"
28 />
29
30
31 <RelativeLayout
32 android:layout_width="fill_parent"
33 android:layout_height="wrap_content">
34 <Button
35 android:id="@+id/button"
36 android:layout_width="wrap_content"
37 android:layout_height="wrap_content"
38 android:text="@string/login"
39 android:layout_alignParentLeft="true"/>
40 <CheckBox
41 android:id="@+id/cb_remember"
42 android:layout_width="wrap_content"
43 android:layout_height="wrap_content"
44 android:text="@string/remember_password"
45 android:layout_alignParentRight="true"/>
46 </RelativeLayout>
47
48 </LinearLayout>
下面开始编写MainActivity.java文件,代码如下:
1 package lq.wangzhen.file;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.text.TextUtils;
6 import android.util.Log;
7 import android.view.View;
8 import android.view.View.OnClickListener;
9 import android.widget.Button;
10 import android.widget.CheckBox;
11 import android.widget.EditText;
12 import android.widget.Toast;
13
14 public class MainActivity extends Activity implements OnClickListener {
15
16 private static final String TAG = "MainActivity";
17 private EditText et_username;
18 private EditText et_password;
19 private Button button;
20 private CheckBox cb_remember;
21
22 @Override
23 protected void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.activity_main);
26
27 et_username = (EditText) this.findViewById(R.id.et_username);
28 et_password = (EditText) this.findViewById(R.id.et_password);
29 button = (Button) this.findViewById(R.id.button);
30 cb_remember = (CheckBox) this.findViewById(R.id.cb_remember);
31
32
33 button.setOnClickListener(this);
34
35 }
36
37 @Override
38 public void onClick(View v) {
39 // TODO Auto-generated method stub
40 switch (v.getId()) {
41 case R.id.button:
42
43 String username = et_username.getText().toString().trim();
44 String password = et_password.getText().toString().trim();
45
46 if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
47 Toast.makeText(this, R.string.error, Toast.LENGTH_SHORT).show();
48 return;
49 }
50 if(cb_remember.isChecked()){
51 Log.i(TAG, "保存用户名和密码,"+username+":"+password);
52 }else{
53 Log.i(TAG, "没有保存用户名和密码,"+username+":"+password);
54 }
55 break;
56 }
57 }
58
59
60 }
以上程序所使用的strings.xml文件的内容如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4 <string name="app_name">file</string>
5 <string name="hello_world">Hello world!</string>
6 <string name="menu_settings">Settings</string>
7
8 <string name="username">用户名</string>
9 <string name="password">密码</string>
10 <string name="login">登陆</string>
11 <string name="remember_password">记住密码</string>
12 <string name="error">用户名和密码不能为空</string>
13
14 </resources>
三、采用rom保存用户数据
下面对以上的程序进行修改,加入可以将用户名和代码保存到文件中的功能,首先新建立一个Service文件,用来操作文件的保存,代码如下:
1 package lq.wangzhen.service;
2
3 import java.io.FileOutputStream;
4
5 import android.content.Context;
6
7 public class FileService {
8
9
10 private Context context;
11
12 public FileService(Context context){
13 this.context = context;
14 }
15 /**
16 * 把用户名和密码保存到手机ROM
17 * @param password 输入要保存的密码
18 * @param username 要保存的用户名
19 * @param filename 保存到哪个文件
20 * @return
21 */
22 public boolean saveToRom(String password,String username,String filename) throws Exception{
23 //以私有的方式打开一个文件
24 FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE);
25 String result = username+":"+password;
26 fos.write(result.getBytes());
27 fos.flush();
28 fos.close();
29 return true;
30 }
31 }
修改MainActivity.java文件,代码如下:
1 package lq.wangzhen.file;
2
3 import lq.wangzhen.service.FileService;
4 import android.app.Activity;
5 import android.os.Bundle;
6 import android.text.TextUtils;
7 import android.util.Log;
8 import android.view.View;
9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.CheckBox;
12 import android.widget.EditText;
13 import android.widget.Toast;
14
15 public class MainActivity extends Activity implements OnClickListener {
16
17 private static final String TAG = "MainActivity";
18 private EditText et_username;
19 private EditText et_password;
20 private Button button;
21 private CheckBox cb_remember;
22 private FileService fileService;
23
24 @Override
25 protected void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.activity_main);
28
29 et_username = (EditText) this.findViewById(R.id.et_username);
30 et_password = (EditText) this.findViewById(R.id.et_password);
31 button = (Button) this.findViewById(R.id.button);
32 cb_remember = (CheckBox) this.findViewById(R.id.cb_remember);
33
34
35 button.setOnClickListener(this);
36
37 //初始化文件服务
38 fileService = new FileService(this);
39
40 }
41
42 @Override
43 public void onClick(View v) {
44 // TODO Auto-generated method stub
45 switch (v.getId()) {
46 case R.id.button:
47
48 String username = et_username.getText().toString().trim();
49 String password = et_password.getText().toString().trim();
50
51 if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
52 Toast.makeText(this, R.string.error, Toast.LENGTH_SHORT).show();
53 return;
54 }
55 if(cb_remember.isChecked()){
56 Log.i(TAG, "保存用户名和密码,"+username+":"+password);
57 try {
58 boolean result = fileService.saveToRom(password, username, "private.txt");
59 if(result){
60 Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_SHORT).show();
61 }else{
62 Toast.makeText(getApplicationContext(), R.string.failed, Toast.LENGTH_SHORT).show();
63 }
64 } catch (Exception e) {
65 // TODO Auto-generated catch block
66 e.printStackTrace();
67 Toast.makeText(getApplicationContext(), R.string.failed, Toast.LENGTH_SHORT).show();
68 }
69 }
70 break;
71 }
72 }
73
74
75 }
在strings.xml文件中添加以下的内容:
1 <string name="success">保存成功</string>
2 <string name="failed">保存失败</string>
运行程序,即可保存成功,保存的文件默认的保存在data/data/lq.wangzhen.file/files文件夹中,其中lq.wangzhen.file表示Activity所在的包名。下面在此程序的基础上加入可以从文件中读取用户名和密码的功能,首先在FileService.java文件中添加以下的一个方法,用来从ROM中读取文件内容。
1 public Map<String,String> getUserInfo(String filename) throws Exception{
2 File file = new File("data/data/lq.wangzhen.file/files/"+filename);
3 FileInputStream fis = new FileInputStream(file);
4 //以上的两句代码也可以通过以下的代码实现:
5 //FileInputStream fis = context.openFileInput(filename);
6 byte[] data = StreamTools.getBytes(fis);
7 String result = new String(data);
8 String results[] = result.split(":");
9 Map<String,String> map = new HashMap<String,String>();
10 map.put("username", results[0]);
11 map.put("password", results[1]);
12 return map;
13 }
在此方法中调用了一个StreamTools.getBytes()方法,此方法是专门用来将一个InputStream流转换为byte数组返回的,所以我们编写此方法为:
1 package lq.wangzhen.util;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.InputStream;
5
6 public class StreamTools {
7
8 /**
9 * 把InputStream中的内容读出来,放到一个byte[]中返回
10 * @param is
11 * @return
12 * @throws Exception
13 */
14 public static byte[] getBytes(InputStream is) throws Exception{
15 ByteArrayOutputStream baos = new ByteArrayOutputStream();
16 byte[] buffer = new byte[1024];
17 int len = 0;
18 while((len=is.read(buffer)) != -1){
19 baos.write(buffer, 0, len);
20 }
21 baos.flush();
22 baos.close();
23 return baos.toByteArray();
24 }
25 }
最后再次修改MainActivity.java文件,调用编写的getUserInfo方法:
1 package lq.wangzhen.file;
2
3 import java.util.Map;
4
5 import lq.wangzhen.service.FileService;
6 import android.app.Activity;
7 import android.os.Bundle;
8 import android.text.TextUtils;
9 import android.util.Log;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.widget.Button;
13 import android.widget.CheckBox;
14 import android.widget.EditText;
15 import android.widget.Toast;
16
17 public class MainActivity extends Activity implements OnClickListener {
18
19 private static final String TAG = "MainActivity";
20 private EditText et_username;
21 private EditText et_password;
22 private Button button;
23 private CheckBox cb_remember;
24 private FileService fileService;
25
26 @Override
27 protected void onCreate(Bundle savedInstanceState) {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.activity_main);
30
31 et_username = (EditText) this.findViewById(R.id.et_username);
32 et_password = (EditText) this.findViewById(R.id.et_password);
33 button = (Button) this.findViewById(R.id.button);
34 cb_remember = (CheckBox) this.findViewById(R.id.cb_remember);
35
36
37 button.setOnClickListener(this);
38
39 //初始化文件服务
40 fileService = new FileService(this);
41
42 try {
43 Map<String,String> map = fileService.getUserInfo("private.txt");
44 et_username.setText(map.get("username"));
45 et_password.setText(map.get("password"));
46 } catch (Exception e) {
47 // TODO Auto-generated catch block
48 e.printStackTrace();
49 }
50
51
52 }
53
54 @Override
55 public void onClick(View v) {
56 // TODO Auto-generated method stub
57 switch (v.getId()) {
58 case R.id.button:
59
60 String username = et_username.getText().toString().trim();
61 String password = et_password.getText().toString().trim();
62
63 if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
64 Toast.makeText(this, R.string.error, Toast.LENGTH_SHORT).show();
65 return;
66 }
67 if(cb_remember.isChecked()){
68 Log.i(TAG, "保存用户名和密码,"+username+":"+password);
69 try {
70 boolean result = fileService.saveToRom(password, username, "private.txt");
71 if(result){
72 Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_SHORT).show();
73 }else{
74 Toast.makeText(getApplicationContext(), R.string.failed, Toast.LENGTH_SHORT).show();
75 }
76 } catch (Exception e) {
77 // TODO Auto-generated catch block
78 e.printStackTrace();
79 Toast.makeText(getApplicationContext(), R.string.failed, Toast.LENGTH_SHORT).show();
80 }
81 }
82 break;
83 }
84 }
85
86
87 }
以上就是这次学习的全部内容,后面会继续的对这个程序作出休整。
http://www.cnblogs.com/wukong65/archive/2013/05/04/3059411.html
Android——用户登陆及用户名和密码的保存的更多相关文章
- linux下如何修改weblogic console登陆的用户名和密码
1. 执行安装目录下config.sh ./config.sh 2.选择 2|Extend an existing WebLogic configuration 3. 别的一路跳过,到修改secur ...
- ubuntu中查看已有的mysql用户并修改用户名和密码
你先进入/etc/mysql 然后该目录下会有一个debian.cnf文件,用sudo cat debian.cnf查看里面的内容. 如果用户名为 debian-sys-maint 使用 mysql ...
- Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示
package com.lixu.clearedittext; import android.app.Activity; import android.os.Bundle; import androi ...
- Android之获取输入用户名与密码发送短信
打算在过两三天的时间我就要准备出发去浙江了,所以把之前的资料来个总结. 这都是在课堂上做过的作业. 好了,废话少说,直接上代码. 步骤: 1.设置单击事件2.获取输入的QQ号码与密码3.判断输入获取的 ...
- 【转】Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示
1 package com.lixu.clearedittext; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 i ...
- 【原创】如何编写c#用户登陆后用户名在前台显示
这种肯定是判断session啦!!!!! @{ string username = (string)Session["username"]; user user = new use ...
- 第一个python程序-判断登陆用户名和密码是否正确
#setencoding=utf-8 #用户名和密码输入正确,则登陆成功 #用户名正确密码错误,只再输入密码,有3次机会 #错误3次,则把用户名放入lock中 import os,sys #存放用户名 ...
- Win7如何取消用户登陆界面
Window取消用户登陆界面 用户已设置密码状态下:删除密码即可. 用户无密码状态下: 运行 → control userpasswords2 → 找到“要使用本机,用户必须输入用户名与密码”这一项, ...
- 【Jmeter】如何通过文件导入方式对用户名和密码进行参数化设置
JMeter 参数化 注意:param和data body只能用一个.所有任何一个里面有内容,切换都会报错,这不是问题,jmeter是这么设计的 方法一:通过添加CSV Data Set Config ...
随机推荐
- perspective结合transform的3D效果
http://css-tricks.com/almanac/properties/p/perspective/ 链接中讲了 perspective的两种用法及比较: 1.perspective:100 ...
- mock.js 使用教程
mock.js 数据模板 #查看模板生成的数据 var data = Mock.mock({ //list|1-10 数组元素个数随机范围, id|+2 属性值递增, age|20-30数值随机范围 ...
- java selenium webdriver实战 应用小结
部分api 1.访问网站 driver.get("http://www.baidu.com"); 或者 driver.navigate().to("http://www. ...
- Drupal7模块multiselect使用
Drupal二次开发的时候,我们时常要使用到多选列表,但是官方默认的多选下拉列表,是在不敢恭维如下图所示: 不过难看不可怕,Drupal有两万第三方模块做支撑,只有你想不到,没有找不到的. 功夫不负有 ...
- UVA-Matrix Chain Multiplication(栈)
Matrix Chain Multiplication Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C, ...
- 如何得到Sessionid的值
当用户向一个网站请求第一个页面时,用户会话启动.当第一个页面被请求时,web服务器将asp.net_sessionID cookie添加进用户的浏览器.可以使用newsession属性探测新会话的启 ...
- HTML5API___manifest
离线缓存 manifest 在html标签里面增加个属性 mainfest 就可以告诉浏览器缓存文件在哪里. <html manifest='show.manifest' xmlns=" ...
- javascript 的工具方法 --- 类型判断
Javascript中常见类型对象有: Boolean, Number, String, Function, Array, Date, RegExp, Object, Error, Symbol等等. ...
- MVC过滤器进行统一登录验证
统一登录验证: 1.定义实体类Person:利用特性标签验证输入合法性设计登录页面 1 2 3 4 5 6 7 8 9 public class Person { [DisplayName(& ...
- iOS网络请求基础
这篇是关于网络请求的,结合公司的实际情况编写,如果有不同意见欢迎留言共同讨论. iOS在9.0之后彻底放弃了NSURLConnection,现在已经改用了NSURLSession进行网络请求.一般现在 ...