android loginDemo +WebService用户登录验证
2016-09-27 14:02
423 查看
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
<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>
②loginActivity.java源码分析
[html] view plain copy
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();
}
});
}
-----以上代码是对界面相关设置
[java] view plain copy
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);
}
}
-----attemptLogin函数是登录验证的调用函数,按键和密码框的响应时间调用attemptLogin来做用户验证,他主要的功能是验证用户输入密码和邮箱的格式的正确与否,如果格式错误,在输入框中显示格式错误信息类型,格式正确后,调用showProgress显示用户验证延时等待对话框和启动mAuthTask异步处理用户信息验证。
[java] view plain copy
@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);
}
}
-----showProgress函数主要是用户登录验证时界面的显示工作,界面显示一个等待对话框。在这个函数里主要做了应用程序的API与系统平台的API对比并处理,关于系统信息的调用学习请参考(Build相关属性和调用系统信息的方法)。
[java] view plain copy
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);
}
}
}
-----UserLoginTask异步方法,该方法主要负责用户后台验证程序,在这里主要做了用户登录信息和预定义信息验证,并做验证后的操作。关于异步的学习可以参考AsyncTask(异步)和Thread(线程)的使用与对比.
注意事项:这个demo为模块界面,其本身不是系统的默认启动界面,要想程序正常工作,要在AndroidManifest.xml中添加如下代码
[html] view plain copy
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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
/*******************************************/
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
/**********************************************/
3、删除attemptLogin方法中的关于用户邮件验证的部分,(程序中有一些要删除的部分,根据理解)。
4、在attemptLogin方法中更改异步方法mAuthTask参数的传递类型。
mAuthTask = new UserLoginTask();
mAuthTask.execute(mEmail,mPassword);
5、重新修改异步方法实现用户登录验证(关于异步的学习可以参考AsyncTask(异步)和Thread(线程)的使用与对比.)
[java] view plain copy
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);
}
}
总结:“关于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、做这个东西和总结了这篇文章,主要是在寻找自己的学习方法,也希望在学习的过程中留下点东西。
本文是基于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
<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>
②loginActivity.java源码分析
[html] view plain copy
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();
}
});
}
-----以上代码是对界面相关设置
[java] view plain copy
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);
}
}
-----attemptLogin函数是登录验证的调用函数,按键和密码框的响应时间调用attemptLogin来做用户验证,他主要的功能是验证用户输入密码和邮箱的格式的正确与否,如果格式错误,在输入框中显示格式错误信息类型,格式正确后,调用showProgress显示用户验证延时等待对话框和启动mAuthTask异步处理用户信息验证。
[java] view plain copy
@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);
}
}
-----showProgress函数主要是用户登录验证时界面的显示工作,界面显示一个等待对话框。在这个函数里主要做了应用程序的API与系统平台的API对比并处理,关于系统信息的调用学习请参考(Build相关属性和调用系统信息的方法)。
[java] view plain copy
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);
}
}
}
-----UserLoginTask异步方法,该方法主要负责用户后台验证程序,在这里主要做了用户登录信息和预定义信息验证,并做验证后的操作。关于异步的学习可以参考AsyncTask(异步)和Thread(线程)的使用与对比.
注意事项:这个demo为模块界面,其本身不是系统的默认启动界面,要想程序正常工作,要在AndroidManifest.xml中添加如下代码
[html] view plain copy
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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
/*******************************************/
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
/**********************************************/
3、删除attemptLogin方法中的关于用户邮件验证的部分,(程序中有一些要删除的部分,根据理解)。
4、在attemptLogin方法中更改异步方法mAuthTask参数的传递类型。
mAuthTask = new UserLoginTask();
mAuthTask.execute(mEmail,mPassword);
5、重新修改异步方法实现用户登录验证(关于异步的学习可以参考AsyncTask(异步)和Thread(线程)的使用与对比.)
[java] view plain copy
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);
}
}
总结:“关于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、做这个东西和总结了这篇文章,主要是在寻找自己的学习方法,也希望在学习的过程中留下点东西。
相关文章推荐
- android loginDemo +WebService用户登录验证 续篇
- android loginDemo +WebService用户登录验证
- Android 通过httpclient请求web服务器,并解决用户登录session保持
- Android中使用webservice验证用户登录的示例
- Android 使用.net开发的webservice做用户登录验证
- Android中使用webservice验证用户登录的示例
- Android调用.NET webservice实现用户登录验证
- 分别用(Windows/Form/Soap/WebService)实现用户身份验证(含示例代码下载)
- Androidannotation使用之@Rest获取资源及用户登录验证(一)
- 分别用(Windows/Form/Soap/WebService)实现用户身份验证(含示例代码下载)
- Java web应用用户是否登录验证过滤处理机制
- [转] 分别用(Windows/Form/Soap/WebService)实现用户身份验证
- 分别用(Windows/Form/Soap/WebService)实现用户身份验证(含示例代码下载)
- android+servlet登录验证简单demo
- java webservice 用户验证 (服务端 + 客户端)
- PBWEBFROM 采用JS来验证用户的合法性及登录
- SpringSecurity-----登录用户权限验证demo
- Android中使用webservice验证用户登录的示例
- 解决员工更换工号后通过SPContext.Current.Web.CurrentUser.LoginName查找当前登录用户还是原来工号的问题
- [已解决]:java webservice 用户验证 (服务端 + 客户端)