android loginDemo +WebService用户登录验证
- <merge xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".LoginActivity" >
- <!-- Login progress -->
- <!-- merge与FrameLayout布局相同,都是帧布局,不同的是,当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。 -->
- <!-- 这个线性布局是验证等待对话框的根元素,这个线性布局包含一个环形进度条,和一个字符标签 -->
- <!-- 设置子元素在这个布局中心排布 -->
- <!-- 设置该布局在父布局及界面中心水平放置 -->
- <!-- 设置子布局纵向布局 -->
- <!-- 设置这个布局界面隐藏不可见 -->
- <LinearLayout
- android:id="@+id/login_status"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center_horizontal"
- android:orientation="vertical"
- android:visibility="gone" >
- <ProgressBar
- style="?android:attr/progressBarStyleLarge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="8dp" />
- <TextView
- android:id="@+id/login_status_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:fontFamily="sans-serif-light"
- android:text="@string/login_progress_signing_in"
- android:textAppearance="?android:attr/textAppearanceMedium" />
- </LinearLayout>
- <!-- Login form -->
- <!-- 根目录为滚动试图 -->
- <ScrollView
- android:id="@+id/login_form"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <!-- 线性纵向排布 -->
- <LinearLayout
- style="@style/LoginFormContainer"
- android:orientation="vertical" >
- <!--邮箱输入框 -->
- <!--hint:设置编辑框无输入显示,设置输入类型为Email型,设置为一行、单行模式 -->
- <EditText
- android:id="@+id/email"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/prompt_email"
- android:inputType="textEmailAddress"
- android:maxLines="1"
- android:singleLine="true" />
- <!-- 密码输入框 -->
- <!-- imeActionLabel设置编辑文本“下一步”的显示内容,imeActionId设置“下一步”的ID, 设置“完成”,设置输入格式显示***-->
- <EditText
- android:id="@+id/password"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/prompt_password"
- android:imeActionId="@+id/login"
- android:imeActionLabel="@string/action_sign_in_short"
- android:imeOptions="actionUnspecified"
- android:inputType="textPassword"
- android:maxLines="1"
- android:singleLine="true" />
- <!-- 提交按钮 -->
- <!--paddingLeft设置左边距 -->
- <Button
- android:id="@+id/sign_in_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:layout_marginTop="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:text="@string/action_sign_in_register" />
- </LinearLayout>
- </ScrollView>
- </merge>
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_login);
- // Set up the login form.
- //获取引入的邮箱并显示
- mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
- mEmailView = (EditText) findViewById(R.id.email);
- mEmailView.setText(mEmail);
- //在密码编辑界面判断软键盘的选择,做对应操作
- mPasswordView = (EditText) findViewById(R.id.password);
- mPasswordView
- .setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView textView, int id,
- KeyEvent keyEvent) {
- if (id == R.id.login || id == EditorInfo.IME_NULL) {//判断软件盘选择的内容
- attemptLogin();
- return true;
- }
- return false;
- }
- });
- mLoginFormView = findViewById(R.id.login_form);
- mLoginStatusView = findViewById(R.id.login_status);
- mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
- //提交按键响应处理
- findViewById(R.id.sign_in_button).setOnClickListener(
- new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- attemptLogin();
- }
- });
- }
- public void attemptLogin() {
- if (mAuthTask != null) {
- return;
- }
- //设置输入框的错误提示为空
- mEmailView.setError(null);
- mPasswordView.setError(null);
- //获取输入框的邮箱和密码
- mEmail = mEmailView.getText().toString();
- mPassword = mPasswordView.getText().toString();
- boolean cancel = false;
- View focusView = null;
- // 设置密码输入框的格式(不能为空,不能小于4位)如果格式错误重新获得焦点,并提示错误内容
- if (TextUtils.isEmpty(mPassword)) {
- mPasswordView.setError(getString(R.string.error_field_required));
- focusView = mPasswordView;
- cancel = true;
- } else if (mPassword.length() < 4) {
- mPasswordView.setError(getString(R.string.error_invalid_password));
- focusView = mPasswordView;
- cancel = true;
- }
- // 设置邮箱格式
- if (TextUtils.isEmpty(mEmail)) {
- mEmailView.setError(getString(R.string.error_field_required));
- focusView = mEmailView;
- cancel = true;
- } else if (!mEmail.contains("@")) {
- mEmailView.setError(getString(R.string.error_invalid_email));
- focusView = mEmailView;
- cancel = true;
- }
- if (cancel) {
- //如果格式错误,输入框重新获得输入焦点
- focusView.requestFocus();
- } else {
- //如果输入的格式正确,显示验证等待对话框,并启动验证线程
- mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
- showProgress(true);
- mAuthTask = new UserLoginTask();
- mAuthTask.execute((Void) null);
- }
- }
- @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)//指出应用程序的API版本
- private void showProgress(final boolean show) {
- //获取运行平台的版本与应用的版本对比实现功能的兼容性
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
- int shortAnimTime = getResources().getInteger(
- android.R.integer.config_shortAnimTime);//获取系统定义的时间
- mLoginStatusView.setVisibility(View.VISIBLE);//设置验证对话框为可显
- mLoginStatusView.animate().setDuration(shortAnimTime)//设置动画显示时间
- .alpha(show ? 1 : 0)//设置动画渐变效果
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLoginStatusView.setVisibility(show ? View.VISIBLE
- : View.GONE);//跟据参数控制该控件显示或隐藏
- }
- });
- mLoginFormView.setVisibility(View.VISIBLE);//设置输入界面可显
- mLoginFormView.animate().setDuration(shortAnimTime)
- .alpha(show ? 0 : 1)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLoginFormView.setVisibility(show ? View.GONE
- : View.VISIBLE);
- }
- });
- } else {
- mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);//跟据参数控制该控件显示或隐藏
- mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
- }
- }
- public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
- @Override
- protected Boolean doInBackground(Void... params) {//后台运行线程
- try {
- //模拟用户验证耗时
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- return false;
- }
- for (String credential : DUMMY_CREDENTIALS) {//遍历数组验证自定义用户及密码
- String[] pieces = credential.split(":");//分割字符串,将密码个邮箱分离开
- if (pieces[0].equals(mEmail)) {
- return pieces[1].equals(mPassword);
- }
- }
- return true;
- }
- @Override
- protected void onPostExecute(final Boolean success) {//线程结束后的ui处理
- mAuthTask = null;
- showProgress(false);//隐藏验证延时对话框
- if (success) {
- finish();
- } else {//密码错误,输入框获得焦点,并提示错误
- mPasswordView
- .setError(getString(R.string.error_incorrect_password));
- mPasswordView.requestFocus();
- }
- }
- //取消验证
- @Override
- protected void onCancelled() {
- mAuthTask = null;
- showProgress(false);
- }
- }
- }
注意事项:这个demo为模块界面,其本身不是系统的默认启动界面,要想程序正常工作,要在AndroidManifest.xml中添加如下代码
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
三、添加WebService用户登录验证代码
- /*******************************************/
- final static String SERVICE_NS = "http://tempuri.org/"; //Webservice所在命名空间
- final static String SERVICE_URL = "http://192.168.1.213:9006/WS_Base.asmx";//Webservice服务地址
- final static String methodName = "AuthenticateLogin";//要使用的接口函数
- private HttpTransportSE ht; //该对象用于调用WebService操作
- private SoapSerializationEnvelope envelope;//上一个类信息的载体
- private SoapObject soapObject; //将参数传递给WebService
- /**********************************************/
- public class UserLoginTask extends AsyncTask<String, Void, Boolean> {
- @Override
- protected Boolean doInBackground(String... params) {
- // TODO: attempt authentication against a network service.
- //set webservices attribute
- /***********************************************/
- //创建HttpTransportSE对象,该对象用于调用WebService操作
- ht = new HttpTransportSE(SERVICE_URL);
- ht.debug = true;
- //创建SoapSerializationEnvelope对象,它是HttpTransportSE调用WebService时消息
- //的载体;客户端需要传入的参数,需要通过SoapSerializationEnvelope对象的bodyOut属性
- //传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
- envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//指明SOPA规范
- //创建SoapObject对象,创建对象时需要传入调用Web Service的命名空间、方法名。
- soapObject = new SoapObject(SERVICE_NS, methodName);
- /************************************************************/
- //SoapObject 对象的addProperty(String name,Object value)方法将参数传递给服务端
- //该方法的name参数指定参数名;value参数指定参数值。
- //如果方法存在多个参数,多次调用addProperty即可。
- soapObject.addProperty("userName",params[0]);
- soapObject.addProperty("password",params[1]);
- envelope.bodyOut = soapObject;
- //设置WebService的开发类型
- envelope.dotNet = true;
- try
- {
- //调用远程WebService,call()方法的参数意义 第一个参数:命名空间+方法名,
- //第二个参数:SoapSerializationEnvelope对象
- ht.call(SERVICE_NS+methodName, envelope);
- if(envelope.getResponse()!=null)
- {
- //SoapSerializationEnvelope对象的bodyIn属性返回一个SoapObject对象,
- //该对象就代表了WebService的返回消息。
- //WebService在服务器端返回值是String类型的数值的时候使用Object代替SoapObject
- SoapObject result = (SoapObject)envelope.bodyIn;
- Object detail1 = (Object) result.getProperty(0);
- return detail1.toString().equals("true");
- }
- return false;
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- catch (XmlPullParserException e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- return false;
- }
- @Override
- protected void onPostExecute(final Boolean success) {
- mAuthTask = null;
- showProgress(false);
- if (success) {
- finish();
- } else {
- mPasswordView
- .setError(getString(R.string.error_incorrect_password));
- mPasswordView.requestFocus();//设置密码框获得焦点
- }
- }
- @Override
- protected void onCancelled() {
- mAuthTask = null;
- showProgress(false);
- }
- }
1.View.VISIBLE,常量值为0,意思是可见的2.View.INVISIBLE,常量值是4,意思是不可见的3.View.GONE,常量值是8,意思是不可见的,并且不占用布局空间
android loginDemo +WebService用户登录验证的更多相关文章
- Python程序练习1-模拟用户登录验证
1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单 ...
- djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习
Django REST framework JWT djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习 SECRET_KEY = '1)q(f8jrz^edwtr2 ...
- cookie实现用户登录验证
cookie实现用户登录验证 1, INSTALLED_APPS中注册app03 2,在主程序中新建映射关系到app3的url中 from django.conf.urls import url,in ...
- python3 用户登录验证的小功能
用户登录验证,记录一下,还需要修改黑名单不合理 #!/usr/bin/env python3 ''' 需求:编写登录接口 1.输入用户名和密码 2.验证用户密码成功后输出欢迎消息 3.3次没有验证通过 ...
- 如何使用Django实现用户登录验证
最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...
- 用javascript实现简单的用户登录验证
用javascript实现简单的用户登录验证 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- django 从零开始 8 用户登录验证 待测
看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理 特别是 from django.contrib.auth import a ...
- Java初学者作业——编写Java程序,实现用户登录验证。
返回本章节 返回作业目录 需求说明: 编写Java程序,实现用户登录验证. 若用户名与密码输入正确,则提示"登录成功,欢迎回来!",若用户名与密码不匹配,则提示"用户名和 ...
- ASP.NET MVC3 实现用户登录验证
自定义一个授权筛选器类,继承于AuthorizeAttribute: using System; using System.Web; using System.Web.Mvc; namespace M ...
随机推荐
- lightoj1080 线段树
//Accepted 6628 KB 520 ms //I a b 把a到b区间的二进制位去反,转化成a到b区间的数全部加1 //Q a 判断第a位的奇偶 #include <cstdio> ...
- IT人才最容易犯的17个错误--人生警言
转载 记得刚参加工作时(那是97年),中国的IT刚刚兴起,那时,作为一个IT人士是一件很光荣的事,而那时的我正在做电气和电子相关的工作.99年第一次跳槽,进入了IT行业做软件开发.至今,中国的IT已经 ...
- UIkit框架之UIScrollView
1.继承链:UIview:UIresponder:NSObject 引言 UIScrollView的是几个UIKit类包括的UITableView和UITextView中的超类. 一个UIScroll ...
- 第一个PHP程序
<html> <head> <title><?php echo"这是第一个php程序"?></title> <st ...
- 日历控件修改的JS代码
var bMoveable=true; var _VersionInfo=" " ; //============================================= ...
- HDU 4902 (线段树)
Problem Nice boat(HDU 4902) 题目大意 维护一个序列,两种操作. 第一种操作,将一段区间[l,r]赋值为x. 第二种操作,将一段区间[l,r]中大于等于x的数与x求gcd. ...
- JLOI 提示问题
按照题目意思模拟即可. Program XJOI2265; ..] of char=('a','e','i','o','u','A','E','I','O','U'); var s:ansistrin ...
- HDU 1721
http://acm.hdu.edu.cn/showproblem.php?pid=1721 非常有趣的一道水题,注意到相隔一个点的粒子数是可以相互转移的,所以只要判红点的和与蓝点的和是否相等 #in ...
- socket() failed (13: Permission denied) while connecting to upstream
/*************************************************************************** * socket() failed (13: ...
- js校验表单后提交表单的三种方法总结(转)
第一种: 代码如下: <script type="text/javascript"> function check(form) { if(form.userId.val ...