实例介绍
【实例截图】
【核心代码】
package siwi.map.android; 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; } /** 记住我的选项是否勾选 */ private boolean isRememberMe() { if (view_rememberMe.isChecked()) { return true; } return false; } /** 登录Button Listener */ private OnClickListener submitListener = new OnClickListener() { @Override public void onClick(View v) { proDialog = ProgressDialog.show(Login.this, "连接中..", "连接中..请稍后....", true, true); // 开一个线程进行登录验证,主要是用于失败,成功可以直接通过startAcitivity(Intent)转向 Thread loginThread = new Thread(new LoginFailureHandler()); loginThread.start(); } }; // .start(); // } // }; /** 记住我checkBoxListener */ private OnCheckedChangeListener rememberMeListener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (view_rememberMe.isChecked()) { Toast.makeText(Login.this, "如果登录成功,以后账号和密码会自动输入!", Toast.LENGTH_SHORT).show(); } } }; /** 注册Listener */ private OnClickListener registerLstener = new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(Login.this, Register.class); // 转向注册页面 startActivity(intent); } }; /** 设置监听器 */ private void setListener() { view_loginSubmit.setOnClickListener(submitListener); view_loginRegister.setOnClickListener(registerLstener); view_rememberMe.setOnCheckedChangeListener(rememberMeListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, MENU_EXIT, 0, getResources().getText(R.string.MENU_EXIT)); menu.add(0, MENU_ABOUT, 0, getResources().getText(R.string.MENU_ABOUT)); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { super.onMenuItemSelected(featureId, item); switch (item.getItemId()) { case MENU_EXIT: finish(); break; case MENU_ABOUT: alertAbout(); break; } return true; } /** 弹出关于对话框 */ private void alertAbout() { new AlertDialog.Builder(Login.this).setTitle(R.string.MENU_ABOUT) .setMessage(R.string.aboutInfo).setPositiveButton( R.string.ok_label, new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialoginterface, int i) { } }).show(); } /** 清除密码 */ private void clearSharePassword() { SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0); share.edit().putString(SHARE_LOGIN_PASSWORD, "").commit(); share = null; } class LoginFailureHandler implements Runnable { @Override public void run() { userName = view_userName.getText().toString(); password = view_password.getText().toString(); //这里换成你的验证地址 String validateURL="http://192.168.1.229:8080/android_server/LoginValidate?userName=" userName "&password=" password; boolean loginState = validateLocalLogin(userName, password, validateURL); Log.d(this.toString(), "validateLogin"); // 登陆成功 if (loginState) { // 需要传输数据到登陆后的界面, Intent intent = new Intent(); intent.setClass(Login.this, IndexPage.class); Bundle bundle = new Bundle(); bundle.putString("MAP_USERNAME", userName); intent.putExtras(bundle); // 转向登陆后的页面 startActivity(intent); proDialog.dismiss(); } else { // 通过调用handler来通知UI主线程更新UI, Message message = new Message(); Bundle bundle = new Bundle(); bundle.putBoolean("isNetError", isNetError); message.setData(bundle); loginHandler.sendMessage(message); } } } }
标签: Android
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论