android loginDemo +WebService用户登录验证

 
     android loginDemo +WebService用户登录验证
本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的。loginActivity是android4.0下的自带演示例程,他自带登录界面、用户名格式设定、输入密码和用户名格式是否正确、用户登录时间进度条等功能,用户可以在这个例程的基础上延伸出自己login用户登录程序。在这里我没有对这个程序做过多的延伸,只是增加Webservice验证用户登录的功能,使其成为一个完整的网络用户登录验证的模块程序。在这我会对这个Demo做全面的解析,使初学者可以理解并能够使用这个Demo。
    一、准备工作(以下的准备步骤都在本人专栏里有相应文章,可以参考下面的连接)
        ③下载 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界面布局代码分析
<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源码分析
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);
		}
	}
                -----attemptLogin函数是登录验证的调用函数,按键和密码框的响应时间调用attemptLogin来做用户验证,他主要的功能是验证用户输入密码和邮箱的格式的正确与否,如果格式错误,在输入框中显示格式错误信息类型,格式正确后,调用showProgress显示用户验证延时等待对话框和启动mAuthTask异步处理用户信息验证。
	@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相关属性和调用系统信息的方法 )。
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中添加如下代码

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


 

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

        由于篇幅问题,该文章的下文在另外的文章中。(android loginDemo +WebService用户登录验证 续篇 )。

 

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值