android loginDemo +WebService用户登录验证

本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的。loginActivity是android4.0下的自带演示例程,他自带登录界面、用户名格式设定、输入密码和用户名格式是否正确、用户登录时间进度条等功能,用户可以在这个例程的基础上延伸出自己login用户登录程序。在这里我没有对这个程序做过多的延伸,只是增加Webservice验证用户登录的功能,使其成为一个完整的网络用户登录验证的模块程序。在这我会对这个Demo做全面的解析,使初学者可以理解并能够使用这个Demo。

一、准备工作(以下的准备步骤都在本人专栏里有相应文章,可以参考下面的连接)

WebService使用的本地数据库建立

基于.net的Webservice编程制作及发布

下载 android的WebService项目包(初学者可以参考android专栏下的Webservice使用例程)。

二、创建并理解android自带loginActivity demo

1、创建android项目,SDK版本为API16、android4.1。然后一直next,在create Activity 中选择loginActivity并将create activity选中。项目创建完成。

2、loginActivity demo的各块源码理解

①activity_login.xml界面布局代码分析

[html] view plain copy

  1. <merge xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. tools:context=".LoginActivity" >
  4. <!-- Login progress -->
  5. <!-- merge与FrameLayout布局相同,都是帧布局,不同的是,当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。 -->
  6. <!-- 这个线性布局是验证等待对话框的根元素,这个线性布局包含一个环形进度条,和一个字符标签 -->
  7. <!-- 设置子元素在这个布局中心排布 -->
  8. <!-- 设置该布局在父布局及界面中心水平放置 -->
  9. <!-- 设置子布局纵向布局 -->
  10. <!-- 设置这个布局界面隐藏不可见 -->
  11. <LinearLayout
  12. android:id="@+id/login_status"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="center"
  16. android:gravity="center_horizontal"
  17. android:orientation="vertical"
  18. android:visibility="gone" >
  19. <ProgressBar
  20. style="?android:attr/progressBarStyleLarge"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_marginBottom="8dp" />
  24. <TextView
  25. android:id="@+id/login_status_message"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_marginBottom="16dp"
  29. android:fontFamily="sans-serif-light"
  30. android:text="@string/login_progress_signing_in"
  31. android:textAppearance="?android:attr/textAppearanceMedium" />
  32. </LinearLayout>
  33. <!-- Login form -->
  34. <!-- 根目录为滚动试图 -->
  35. <ScrollView
  36. android:id="@+id/login_form"
  37. android:layout_width="match_parent"
  38. android:layout_height="match_parent" >
  39. <!-- 线性纵向排布 -->
  40. <LinearLayout
  41. style="@style/LoginFormContainer"
  42. android:orientation="vertical" >
  43. <!--邮箱输入框  -->
  44. <!--hint:设置编辑框无输入显示,设置输入类型为Email型,设置为一行、单行模式  -->
  45. <EditText
  46. android:id="@+id/email"
  47. android:layout_width="match_parent"
  48. android:layout_height="wrap_content"
  49. android:hint="@string/prompt_email"
  50. android:inputType="textEmailAddress"
  51. android:maxLines="1"
  52. android:singleLine="true" />
  53. <!-- 密码输入框 -->
  54. <!-- imeActionLabel设置编辑文本“下一步”的显示内容,imeActionId设置“下一步”的ID, 设置“完成”,设置输入格式显示***-->
  55. <EditText
  56. android:id="@+id/password"
  57. android:layout_width="match_parent"
  58. android:layout_height="wrap_content"
  59. android:hint="@string/prompt_password"
  60. android:imeActionId="@+id/login"
  61. android:imeActionLabel="@string/action_sign_in_short"
  62. android:imeOptions="actionUnspecified"
  63. android:inputType="textPassword"
  64. android:maxLines="1"
  65. android:singleLine="true" />
  66. <!-- 提交按钮 -->
  67. <!--paddingLeft设置左边距  -->
  68. <Button
  69. android:id="@+id/sign_in_button"
  70. android:layout_width="wrap_content"
  71. android:layout_height="wrap_content"
  72. android:layout_gravity="right"
  73. android:layout_marginTop="16dp"
  74. android:paddingLeft="32dp"
  75. android:paddingRight="32dp"
  76. android:text="@string/action_sign_in_register" />
  77. </LinearLayout>
  78. </ScrollView>
  79. </merge>

②loginActivity.java源码分析

[html] view plain copy

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_login);
  4. // Set up the login form.
  5. //获取引入的邮箱并显示
  6. mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
  7. mEmailView = (EditText) findViewById(R.id.email);
  8. mEmailView.setText(mEmail);
  9. //在密码编辑界面判断软键盘的选择,做对应操作
  10. mPasswordView = (EditText) findViewById(R.id.password);
  11. mPasswordView
  12. .setOnEditorActionListener(new TextView.OnEditorActionListener() {
  13. @Override
  14. public boolean onEditorAction(TextView textView, int id,
  15. KeyEvent keyEvent) {
  16. if (id == R.id.login || id == EditorInfo.IME_NULL) {//判断软件盘选择的内容
  17. attemptLogin();
  18. return true;
  19. }
  20. return false;
  21. }
  22. });
  23. mLoginFormView = findViewById(R.id.login_form);
  24. mLoginStatusView = findViewById(R.id.login_status);
  25. mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
  26. //提交按键响应处理
  27. findViewById(R.id.sign_in_button).setOnClickListener(
  28. new View.OnClickListener() {
  29. @Override
  30. public void onClick(View view) {
  31. attemptLogin();
  32. }
  33. });
  34. }

-----以上代码是对界面相关设置

[java] view plain copy

  1. public void attemptLogin() {
  2. if (mAuthTask != null) {
  3. return;
  4. }
  5. //设置输入框的错误提示为空
  6. mEmailView.setError(null);
  7. mPasswordView.setError(null);
  8. //获取输入框的邮箱和密码
  9. mEmail = mEmailView.getText().toString();
  10. mPassword = mPasswordView.getText().toString();
  11. boolean cancel = false;
  12. View focusView = null;
  13. // 设置密码输入框的格式(不能为空,不能小于4位)如果格式错误重新获得焦点,并提示错误内容
  14. if (TextUtils.isEmpty(mPassword)) {
  15. mPasswordView.setError(getString(R.string.error_field_required));
  16. focusView = mPasswordView;
  17. cancel = true;
  18. } else if (mPassword.length() < 4) {
  19. mPasswordView.setError(getString(R.string.error_invalid_password));
  20. focusView = mPasswordView;
  21. cancel = true;
  22. }
  23. // 设置邮箱格式
  24. if (TextUtils.isEmpty(mEmail)) {
  25. mEmailView.setError(getString(R.string.error_field_required));
  26. focusView = mEmailView;
  27. cancel = true;
  28. } else if (!mEmail.contains("@")) {
  29. mEmailView.setError(getString(R.string.error_invalid_email));
  30. focusView = mEmailView;
  31. cancel = true;
  32. }
  33. if (cancel) {
  34. //如果格式错误,输入框重新获得输入焦点
  35. focusView.requestFocus();
  36. } else {
  37. //如果输入的格式正确,显示验证等待对话框,并启动验证线程
  38. mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
  39. showProgress(true);
  40. mAuthTask = new UserLoginTask();
  41. mAuthTask.execute((Void) null);
  42. }
  43. }

-----attemptLogin函数是登录验证的调用函数,按键和密码框的响应时间调用attemptLogin来做用户验证,他主要的功能是验证用户输入密码和邮箱的格式的正确与否,如果格式错误,在输入框中显示格式错误信息类型,格式正确后,调用showProgress显示用户验证延时等待对话框和启动mAuthTask异步处理用户信息验证。

[java] view plain copy

  1. @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)//指出应用程序的API版本
  2. private void showProgress(final boolean show) {
  3. //获取运行平台的版本与应用的版本对比实现功能的兼容性
  4. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
  5. int shortAnimTime = getResources().getInteger(
  6. android.R.integer.config_shortAnimTime);//获取系统定义的时间
  7. mLoginStatusView.setVisibility(View.VISIBLE);//设置验证对话框为可显
  8. mLoginStatusView.animate().setDuration(shortAnimTime)//设置动画显示时间
  9. .alpha(show ? 1 : 0)//设置动画渐变效果
  10. .setListener(new AnimatorListenerAdapter() {
  11. @Override
  12. public void onAnimationEnd(Animator animation) {
  13. mLoginStatusView.setVisibility(show ? View.VISIBLE
  14. : View.GONE);//跟据参数控制该控件显示或隐藏
  15. }
  16. });
  17. mLoginFormView.setVisibility(View.VISIBLE);//设置输入界面可显
  18. mLoginFormView.animate().setDuration(shortAnimTime)
  19. .alpha(show ? 0 : 1)
  20. .setListener(new AnimatorListenerAdapter() {
  21. @Override
  22. public void onAnimationEnd(Animator animation) {
  23. mLoginFormView.setVisibility(show ? View.GONE
  24. : View.VISIBLE);
  25. }
  26. });
  27. } else {
  28. mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);//跟据参数控制该控件显示或隐藏
  29. mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
  30. }
  31. }

-----showProgress函数主要是用户登录验证时界面的显示工作,界面显示一个等待对话框。在这个函数里主要做了应用程序的API与系统平台的API对比并处理,关于系统信息的调用学习请参考(Build相关属性和调用系统信息的方法)。

[java] view plain copy

  1. public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
  2. @Override
  3. protected Boolean doInBackground(Void... params) {//后台运行线程
  4. try {
  5. //模拟用户验证耗时
  6. Thread.sleep(2000);
  7. } catch (InterruptedException e) {
  8. return false;
  9. }
  10. for (String credential : DUMMY_CREDENTIALS) {//遍历数组验证自定义用户及密码
  11. String[] pieces = credential.split(":");//分割字符串,将密码个邮箱分离开
  12. if (pieces[0].equals(mEmail)) {
  13. return pieces[1].equals(mPassword);
  14. }
  15. }
  16. return true;
  17. }
  18. @Override
  19. protected void onPostExecute(final Boolean success) {//线程结束后的ui处理
  20. mAuthTask = null;
  21. showProgress(false);//隐藏验证延时对话框
  22. if (success) {
  23. finish();
  24. } else {//密码错误,输入框获得焦点,并提示错误
  25. mPasswordView
  26. .setError(getString(R.string.error_incorrect_password));
  27. mPasswordView.requestFocus();
  28. }
  29. }
  30. //取消验证
  31. @Override
  32. protected void onCancelled() {
  33. mAuthTask = null;
  34. showProgress(false);
  35. }
  36. }
  37. }

-----UserLoginTask异步方法,该方法主要负责用户后台验证程序,在这里主要做了用户登录信息和预定义信息验证,并做验证后的操作。关于异步的学习可以参考AsyncTask(异步)和Thread(线程)的使用与对比.

注意事项:这个demo为模块界面,其本身不是系统的默认启动界面,要想程序正常工作,要在AndroidManifest.xml中添加如下代码

[html] view plain copy

  1. <intent-filter>
  2. <action android:name="android.intent.action.MAIN" />
  3. <category android:name="android.intent.category.LAUNCHER" />
  4. </intent-filter>

三、添加WebService用户登录验证代码

本文为android loginDemo +WebService用户登录验证的续篇,在这里我主要总结的是在LoginActivity的demo中添加webservice代码实现用户网络验证(本地验证参考android loginDemo +WebService用户登录验证)。

1、添加用户上网权限

在AndroidManifest.xml中添加用户权限,添加如下代码使用户有上网的权限。

<uses-permission android:name="android.permission.INTERNET"/>

2、定义Webservice的命名空间和服务地址以及Webservice方法,定义android下webservice的相关对象。

Webservice的服务地址和命名空间及内部方法的获得,请参考(Android 使用.net开发的webservice做用户登录验证)中的WebService解析。关于android下webservice的使用请参考()webservice的入门学习。

定义Webservice相关函数代码

[html] view plain copy

  1. /*******************************************/
  2. final static String SERVICE_NS = "http://tempuri.org/"; //Webservice所在命名空间
  3. final static String SERVICE_URL = "http://192.168.1.213:9006/WS_Base.asmx";//Webservice服务地址
  4. final static String methodName = "AuthenticateLogin";//要使用的接口函数
  5. private HttpTransportSE ht; //该对象用于调用WebService操作
  6. private SoapSerializationEnvelope envelope;//上一个类信息的载体
  7. private SoapObject soapObject; //将参数传递给WebService
  8. /**********************************************/

3、删除attemptLogin方法中的关于用户邮件验证的部分,(程序中有一些要删除的部分,根据理解)。

4、在attemptLogin方法中更改异步方法mAuthTask参数的传递类型。

mAuthTask = new UserLoginTask();

mAuthTask.execute(mEmail,mPassword);

5、重新修改异步方法实现用户登录验证(关于异步的学习可以参考AsyncTask(异步)和Thread(线程)的使用与对比.)

[java] view plain copy

  1. public class UserLoginTask extends AsyncTask<String, Void, Boolean> {
  2. @Override
  3. protected Boolean doInBackground(String... params) {
  4. // TODO: attempt authentication against a network service.
  5. //set webservices attribute
  6. /***********************************************/
  7. //创建HttpTransportSE对象,该对象用于调用WebService操作
  8. ht = new HttpTransportSE(SERVICE_URL);
  9. ht.debug = true;
  10. //创建SoapSerializationEnvelope对象,它是HttpTransportSE调用WebService时消息
  11. //的载体;客户端需要传入的参数,需要通过SoapSerializationEnvelope对象的bodyOut属性
  12. //传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
  13. envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//指明SOPA规范
  14. //创建SoapObject对象,创建对象时需要传入调用Web Service的命名空间、方法名。
  15. soapObject = new SoapObject(SERVICE_NS, methodName);
  16. /************************************************************/
  17. //SoapObject 对象的addProperty(String name,Object value)方法将参数传递给服务端
  18. //该方法的name参数指定参数名;value参数指定参数值。
  19. //如果方法存在多个参数,多次调用addProperty即可。
  20. soapObject.addProperty("userName",params[0]);
  21. soapObject.addProperty("password",params[1]);
  22. envelope.bodyOut = soapObject;
  23. //设置WebService的开发类型
  24. envelope.dotNet = true;
  25. try
  26. {
  27. //调用远程WebService,call()方法的参数意义 第一个参数:命名空间+方法名,
  28. //第二个参数:SoapSerializationEnvelope对象
  29. ht.call(SERVICE_NS+methodName, envelope);
  30. if(envelope.getResponse()!=null)
  31. {
  32. //SoapSerializationEnvelope对象的bodyIn属性返回一个SoapObject对象,
  33. //该对象就代表了WebService的返回消息。
  34. //WebService在服务器端返回值是String类型的数值的时候使用Object代替SoapObject
  35. SoapObject result = (SoapObject)envelope.bodyIn;
  36. Object detail1 = (Object) result.getProperty(0);
  37. return detail1.toString().equals("true");
  38. }
  39. return false;
  40. }
  41. catch (IOException e)
  42. {
  43. e.printStackTrace();
  44. }
  45. catch (XmlPullParserException e) {
  46. // TODO: handle exception
  47. e.printStackTrace();
  48. }
  49. return false;
  50. }
  51. @Override
  52. protected void onPostExecute(final Boolean success) {
  53. mAuthTask = null;
  54. showProgress(false);
  55. if (success) {
  56. finish();
  57. } else {
  58. mPasswordView
  59. .setError(getString(R.string.error_incorrect_password));
  60. mPasswordView.requestFocus();//设置密码框获得焦点
  61. }
  62. }
  63. @Override
  64. protected void onCancelled() {
  65. mAuthTask = null;
  66. showProgress(false);
  67. }
  68. }

总结:“关于android loginDemo +WebService用户登录验证”实验中遇到的问题及知识点总结

1、@Override是什么意思

没什么用,这是IDE编辑器为你自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次。

2、@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)。

说明应用的API版本,在代码中获得平台的SDK版本与这个版本对比,在代码中判断应用与平台的兼容性。

关于获取及使用用户信息的Bulid列的介绍及使用说明,参考android专栏

3、EditText:

    ①android:imeOptions 设置软键盘的Enter键。有如下值可设置:normal,actionUnspecified,actionNone,actionGo,actionSearch,actionSend,actionNext,actionDone,flagNoExtractUi    ,flagNoAccessoryAction,flagNoEnterAction。可用’|’设置多个。

设置 android:imeOptions="actionDone" ,软键盘下方变成“完成”,点击后光标保持在原来的输入框上,并且软键盘关闭。

android:imeOptions="actionSend" 软键盘下方变成“发送”,点击后光标移动下一个。

②setError(string);设置编辑框的提示,例如setError(“密码不能为空”);

③focusView.requestFocus();设置编辑框获得焦点,实例:

focusView = mEmailView;

focusView.requestFocus();

View:

①setVisibility设置空间在界面的可见性

1.View.VISIBLE,常量值为0,意思是可见的

2.View.INVISIBLE,常量值是4,意思是不可见的

3.View.GONE,常量值是8,意思是不可见的,并且不占用布局空间

XML:

①Android:Layout_gravity    设置该组件在其容器中的对其方式。

Android:Layout_gravity=” center“(在组件中心)。

android:gravity     设置组件的子组件在组件中的位置,可以同时制定多种对齐方式的组合

android:gravity="left|center_vertical"代表出现在屏幕左边,而且垂直居中。

②android:inputType 设置文本的输入类型

android:inputType =“textPassword”设置输入类型为密码。

<b> 标签呈现粗体文本效果:

<string name="action_sign_in_register"><b>Sign in</b> or register</string>

String 类

①String.split

根据给定的正则表达式的匹配来拆分此字符串。

4、Build相关属性和调用系统信息的方法:

5、AsyncTask(异步)和Thread(线程)的使用与对比

6、做这个东西和总结了这篇文章,主要是在寻找自己的学习方法,也希望在学习的过程中留下点东西。

时间: 2024-08-05 11:16:21

android loginDemo +WebService用户登录验证的相关文章

linux命令:系统裁剪之三login: 用户登录验证

Linux系统裁剪笔记 1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好的地方请指教. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是用的

ASP.NET MVC3 实现用户登录验证

原文:ASP.NET MVC3 实现用户登录验证 自定义一个授权筛选器类,继承于AuthorizeAttribute: using System; using System.Web; using System.Web.Mvc; namespace MvcApplication1 { public class DWAuthorizeAttribute : AuthorizeAttribute { /// <summary> /// 判断用户是否登录 /// </summary> //

简明Python教程(四)———用户登录验证

例子: 实现目标,用Python编写用户登录验证脚本. 知识点: 1.while和if控制流 2.运算表达式 验证过程: 脚本: #!/usr/bin/env python#filename : User login authentication#import sysname = 'Tiger'passwd = '123456'counter = 0times = 3while True:                         #-----------无限循环 username = r

struts2 学习(三) ----- 用户登录验证

下面是struts2 的第三个程序(用户登录验证)步骤:(需要新建login.jsp,Login.java和message.jsp) 1.增加Struts框架,步骤在第一篇中. 2.新建一个login.jsp.布局如下: 3.然后新建一个class,名为Login.java,代码如下: 4.在struts.xml文件中,代码如下: 5.新建message.jsp页面,代码如下: 6.OK,运行. **************************************************

yii 用户登录验证(cwebuser) yii 用户登录 (记)

yii 的确是一个强大而臃肿的框架,简单的小项目,或者只做后台接口调用的项目,建议不要用. 今天记录一下yii使用中cwebuser(Yii::app()->user->login())登录: 1.准备工作 官方标准做法,在components里加一个UserIdentity.php文件,class UserIdentity extends CUserIdentity 继承CUserIdentity,然后在UserIdentity类里面写验证的业务过程(比如你在哪张表去查数据,取数据之类) 2

用户登录验证Ajax实例详解

程序的思路主要是:页面加载时调用init判断客户端是否存有网站所需的cookies,如果有的话取相应cookies到服务端验证,通过验证显示成功提示,反之显示登录框,同样如果没有所需cookies也显示登录框直到用户输入正确的用户名和密码.整个过程两次用到了ajax,一次是用户输入用户名和密码点击登录按钮后,另一次是页面加载时的用户名和密码验证,其实两个过程调用的是同一个函数parseLogin,这个函数主要负责与远程(也就是"?action=login")通讯,而"?act

ThinkPHP中利用SESSION实现用户登录验证的方法

用户登上一个主页无非有这么两种状态,一种是类似于游客的身份登录,另一种是曾经已经登陆过的身份即经过服务器验证过的身份登录. 针对这两种登录,主要说一下: 我们在使用thinkphp的时候,首先,他是不提高登录验证功能的,仅仅是在路径方面做的相对比较安全,因为我们如果不对登录身份进行充足的验证,用户就完全可以去试着登录你的后台管理,那么这是非常可怕的,所以,首先要明白一个非常重要的业务逻辑. 如果按照正常的输入用户名密码的方式进行登录,在跳转之前我们就应该写入session数据,然后用数据进行登录

面向对象-基础实现用户登录验证

使用初始化参数的方法输入用户名密码实现基础的用户登录功能. 实现一:基本功能实现 public class Test3 { public static void main(String[] args) { if(args.length != 2){ System.out.println("您输入的参数不合法"); System.out.println("格式为:admin 123 用户名 密码"); System.exit(1); } String name = a

Codeigniter处理用户登录验证后URL跳转

涉及到My_Controller.php以及登录验证模块User.php,代码如下: My_Controller.php class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); /*判断是否登录,判断当前URL是否是auth/login*/ if ( ! $this->tank_auth->is_logged_in() && ( $thi