package siwi.map.android;
//Download by http://www.codefans.net
import java.io.DataInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class Login extends Activity {
/** Called when the activity is first created. */
// 1.远程登录(用户名和密码超过3位长度则成功,在服务器可以自己设置代码)
// 2.含有loading效果(多线程处理,时事返回数据)
// 3.登录不成功能够提示出错原因
// 4.保存登錄后的信息(如用戶名和密碼,可以自己設置)
// 注意:
//1.需要设置androidManifest文件
// <activity android:name=".IndexPage" android:label="登陆后的页面"
// />
// <activity android:name=".Register" android:label="注册"
// />
// </application>
// <uses-permission android:name="android.permission.INTERNET" />
//2.需要编写一个服务器servlet代码
// String userName = request.getParameter("userName");
// String password = request.getParameter("password");
// System.out.println(userName+"-"+password);
// DataOutputStream dos = new DataOutputStream(response.getOutputStream());
// if (userName != null && password != null) {
// if (userName.length() > 3 && password.length() > 3) {
// dos.writeInt(16);
// }else{
// dos.writeInt(0);
// }
// } else {
// dos.writeInt(0);
// }
// dos.flush();
// dos.close();
//3.别望了配置web.xml(如果是jsp则可以不用配置)
//4.需要在Login.class中的内部类LoginFailureHandler的run方法中的validateURL
private String userName;
private String password;
/** 以下是UI */
private EditText view_userName;
private EditText view_password;
private CheckBox view_rememberMe;
private Button view_loginSubmit;
private Button view_loginRegister;
private static final int MENU_EXIT = Menu.FIRST - 1;
private static final int MENU_ABOUT = Menu.FIRST;
/** 用来操作SharePreferences的标识 */
private final String SHARE_LOGIN_TAG = "MAP_SHARE_LOGIN_TAG";
/** 如果登录成功后,用于保存用户名到SharedPreferences,以便下次不再输入 */
private String SHARE_LOGIN_USERNAME = "MAP_LOGIN_USERNAME";
/** 如果登录成功后,用于保存PASSWORD到SharedPreferences,以便下次不再输入 */
private String SHARE_LOGIN_PASSWORD = "MAP_LOGIN_PASSWORD";
/** 如果登陆失败,这个可以给用户确切的消息显示,true是网络连接失败,false是用户名和密码错误 */
private boolean isNetError;
/** 登录loading提示框 */
private ProgressDialog proDialog;
/** 登录后台通知更新UI线程,主要用于登录失败,通知UI线程更新界面 */
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = msg.getData().getBoolean("isNetError");
if (proDialog != null) {
proDialog.dismiss();
}
if (isNetError) {
Toast.makeText(Login.this, "登陆失败:\n1.请检查您网络连接.\n2.请联系我们.!",
Toast.LENGTH_SHORT).show();
}
// 用户名和密码错误
else {
Toast.makeText(Login.this, "登陆失败,请输入正确的用户名和密码!",
Toast.LENGTH_SHORT).show();
// 清除以前的SharePreferences密码
clearSharePassword();
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
findViewsById();
initView(false);
// 需要去submitListener里面设置URL
setListener();
}
/** 初始化注册View组件 */
private void findViewsById() {
view_userName = (EditText) findViewById(R.id.loginUserNameEdit);
view_password = (EditText) findViewById(R.id.loginPasswordEdit);
view_rememberMe = (CheckBox) findViewById(R.id.loginRememberMeCheckBox);
view_loginSubmit = (Button) findViewById(R.id.loginSubmit);
view_loginRegister = (Button) findViewById(R.id.loginRegister);
}
/**
* 初始化界面
*
* @param isRememberMe
* 如果当时点击了RememberMe,并且登陆成功过一次,则saveSharePreferences(true,ture)后,则直接进入
* */
private void initView(boolean isRememberMe) {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
String userName = share.getString(SHARE_LOGIN_USERNAME, "");
String password = share.getString(SHARE_LOGIN_PASSWORD, "");
Log
.d(this.toString(), "userName=" + userName + " password="
+ password);
if (!"".equals(userName)) {
view_userName.setText(userName);
}
if (!"".equals(password)) {
view_password.setText(password);
view_rememberMe.setChecked(true);
}
// 如果密码也保存了,则直接让登陆按钮获取焦点
if (view_password.getText().toString().length() > 0) {
// view_loginSubmit.requestFocus();
// view_password.requestFocus();
}
share = null;
}
/**
* 检查用户登陆,服务器通过DataOutputStream的dos.writeInt(int);来判断是否登录成功(
* 服务器返回int>0登陆成功,否则失败),登陆成功后根据isRememberMe来判断是否保留密码(用户名是会保留的),
* 如果连接服务器超过5秒,也算连接失败.
*
* @param userName
* 用户名
* @param password
* 密码
* @param validateUrl
* 检查登陆的地址
* */
private boolean validateLocalLogin(String userName, String password,
String validateUrl) {
// 用于标记登陆状态
boolean loginState = false;
HttpURLConnection conn = null;
DataInputStream dis = null;
try {
URL url = new URL(validateUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
conn.connect();
dis = new DataInputStream(conn.getInputStream());
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
Log.d(this.toString(),
"getResponseCode() not HttpURLConnection.HTTP_OK");
isNetError = true;
return false;
}
// 读取服务器的登录状态码
int loginStateInt = dis.readInt();
if (loginStateInt > 0) {
loginState = true;
}
} catch (Exception e) {
e.printStackTrace();
isNetError = true;
Log.d(this.toString(), e.getMessage() + " 127 line");
} finally {
if (conn != null) {
conn.disconnect();
}
}
// 登陆成功
if (loginState) {
if (isRememberMe()) {
saveSharePreferences(true, true);
} else {
saveSharePreferences(true, false);
}
} else {
// 如果不是网络错误
if (!isNetError) {
clearSharePassword();
}
}
if (!view_rememberMe.isChecked()) {
clearSharePassword();
}
return loginState;
}
/**
* 如果登录成功过,则将登陆用户名和密码记录在SharePreferences
*
* @param saveUserName
* 是否将用户名保存到SharePreferences
* @param savePassword
* 是否将密码保存到SharePreferences
* */
private void saveSharePreferences(boolean saveUserName, boolean savePassword) {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
if (saveUserName) {
Log.d(this.toString(), "saveUserName="
+ view_userName.getText().toString());
share.edit().putString(SHARE_LOGIN_USERNAME,
view_userName.getText().toString()).commit();
}
if (savePassword) {
share.edit().putString(SHARE_LOGIN_PASSWORD,
view_password.getText().toString()).commit();
}
share = null;
}
/** 记住我的选项是否勾选 */
p
含有loading效果登录界面
需积分: 50 112 浏览量
2013-11-15
13:26:47
上传
评论 1
收藏 71KB RAR 举报
liangqisheng
- 粉丝: 2
- 资源: 13
最新资源
- GEC6818:一款高性能嵌入式开发板GEC6818:一款高性能嵌入式开发板
- 红外和可见光图像融合,红外和可见光图像融合目的,Python实现源码(优质项目源码).zip
- Python中的数据可视化工具Matplotlib
- Yolov8算法在自定义数据集上的训练和应用Yolov8算法在自定义数据集上的训练和应用
- 代码迷宫2.sb3
- C#课程设计大作基于WinForm的页面美观功能完整的导师双选系统源码..zip
- 基于C#实现的Crazepony上位机源代码
- 基于Flask+vue的环境管理系统源码(优质项目源码).zip
- 冒泡排序的定义及java代码实现
- 平均电流知识点(包含平均电流的建模和概述)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈