Android项目怎么实现对手行参与机构未登录录的时候进入登录界面,登录的话下次进来进入首页

Android技巧2:登录注册模块解决方案
几乎每个app都会有登录注册的功能,可以看看笔者开发的『南方周末新闻器』,登录、手机注册、忘记密码这些入口,这些功能在app中要如何来实现呢?这个模块看似很简单,但要做好就需要考虑很多细节,比如对用户的输入的容错,操作的提示文案的设定,登录成功保存用户信息等等。
业务流程图
业务逻辑描述
上一节的流程图已经很清晰的展现了登录注册的流程,这里继续用文字说明一下:
1. 点击进入个人中心或者需要用户登录状态的操作,先判断用户是否已经登录。
2. 如果已经登录,则继续后面的业务,否则,跳转到登录页面进行登录。
3. 如果已经有账号,则可以直接登录,或者可以直接选择第三方平台授权登录。
4. 如果未注册账号,则需要先进行账号注册,注册成功后再登录;也可以不注册账号,通过第三方平台授权进行登录。
5. 如果有账号,但忘记密码,则需要进行重置密码,否则直接登录。
登录可以使用账号登录,现在的app基本上都是手机号码登录,注册的时候也是一个手机对应一个账号,通过发送验证码进行验证;用户也可以选择第三方平台进行登录,一般会提供微信、QQ、新浪微博这样的主流社交平台进行授权登录,这里笔者使用了友盟的SDK进行实现。
示例代码:LoginActivity.java
package com.devilwwj.
import android.app.A
import android.content.I
import android.os.B
import android.text.TextU
import android.text.method.HideReturnsTransformationM
import android.text.method.PasswordTransformationM
import android.view.KeyE
import android.view.V
import android.view.inputmethod.EditorI
import android.widget.TextV
import android.widget.T
import com.devilwwj.loginandregister.global.AppC
import com.devilwwj.loginandregister.utils.LogU
import com.devilwwj.loginandregister.utils.ProgressDialogU
import com.devilwwj.loginandregister.utils.RegexU
import com.devilwwj.loginandregister.utils.ShareU
import com.devilwwj.loginandregister.utils.SpU
import com.devilwwj.loginandregister.utils.ToastU
import com.devilwwj.loginandregister.utils.U
import com.devilwwj.loginandregister.views.CleanEditT
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.controller.UMServiceF
import com.umeng.socialize.controller.UMSocialS
import com.umeng.socialize.controller.listener.SocializeListeners.UMAuthL
import com.umeng.socialize.controller.listener.SocializeListeners.UMDataL
import com.umeng.socialize.exception.SocializeE
import java.util.M
import static android.view.View.OnClickL
* @desc 登录界面
* Created by devilwwj on 16/1/24.
public class LoginActivity extends Activity implements OnClickListener {
private static final String TAG = &loginActivity&;
private static final int REQUEST_CODE_TO_REGISTER = 0x001;
// 界面控件
private CleanEditText accountE
private CleanEditText passwordE
// 第三方平台获取的访问token,有效时间,uid
private String accessT
private String expires_
// 整个平台的Controller,负责管理整个SDK的配置、操作等处理
private UMSocialService mController = UMServiceFactory
.getUMSocialService(AppConstants.DESCRIPTOR);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
// 配置分享平台
ShareUtils.configPlatforms(this);
* 初始化视图
private void initViews() {
accountEdit = (CleanEditText) this.findViewById(R.id.et_email_phone);
accountEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
accountEdit.setTransformationMethod(HideReturnsTransformationMethod
.getInstance());
passwordEdit = (CleanEditText) this.findViewById(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setTransformationMethod(PasswordTransformationMethod
.getInstance());
passwordEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE
|| actionId == EditorInfo.IME_ACTION_GO) {
clickLogin();
private void clickLogin() {
String account = accountEdit.getText().toString();
String password = passwordEdit.getText().toString();
if (checkInput(account, password)) {
// TODO: 请求服务器登录账号
* 检查输入
* @param account
* @param password
public boolean checkInput(String account, String password) {
// 账号为空时提示
if (account == null || account.trim().equals(&&)) {
Toast.makeText(this, R.string.tip_account_empty, Toast.LENGTH_LONG)
// 账号不匹配手机号格式(11位数字且以1开头)
if ( !RegexUtils.checkMobile(account)) {
Toast.makeText(this, R.string.tip_account_regex_not_right,
Toast.LENGTH_LONG).show();
} else if (password == null || password.trim().equals(&&)) {
Toast.makeText(this, R.string.tip_password_can_not_be_empty,
Toast.LENGTH_LONG).show();
public void onClick(View v) {
Intent intent =
switch (v.getId()) {
case R.id.iv_cancel:
case R.id.btn_login:
clickLogin();
case R.id.iv_wechat:
clickLoginWexin();
case R.id.iv_qq:
clickLoginQQ();
case R.id.iv_sina:
loginThirdPlatform(SHARE_MEDIA.SINA);
case R.id.tv_create_account:
enterRegister();
case R.id.tv_forget_password:
enterForgetPwd();
* 点击使用QQ快速登录
private void clickLoginQQ() {
if (!Utils.isQQClientAvailable(this)) {
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_qq));
loginThirdPlatform(SHARE_MEDIA.QZONE);
* 点击使用微信登录
private void clickLoginWexin() {
if (!Utils.isWeixinAvilible(this)) {
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_wechat));
loginThirdPlatform(SHARE_MEDIA.WEIXIN);
* 跳转到忘记密码
private void enterForgetPwd() {
Intent intent = new Intent(this, ForgetPasswordActivity.class);
startActivity(intent);
* 跳转到注册页面
private void enterRegister() {
Intent intent = new Intent(this, SignUpActivity.class);
startActivityForResult(intent, REQUEST_CODE_TO_REGISTER);
* 授权。如果授权成功,则获取用户信息
* @param platform
private void loginThirdPlatform(final SHARE_MEDIA platform) {
mController.doOauthVerify(LoginActivity.this, platform,
new UMAuthListener() {
public void onStart(SHARE_MEDIA platform) {
LogUtils.i(TAG, &onStart------&
+ Thread.currentThread().getId());
ProgressDialogUtils.getInstance().show(
LoginActivity.this,
getString(R.string.tip_begin_oauth));
public void onError(SocializeException e,
SHARE_MEDIA platform) {
LogUtils.i(TAG, &onError------&
+ Thread.currentThread().getId());
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_fail));
ProgressDialogUtils.getInstance().dismiss();
public void onComplete(Bundle value, SHARE_MEDIA platform) {
LogUtils.i(TAG, &onComplete------& + value.toString());
if (platform == SHARE_MEDIA.SINA) {
accessToken = value.getString(&access_key&);
accessToken = value.getString(&access_token&);
expires_in = value.getString(&expires_in&);
// 获取uid
uid = value.getString(AppConstants.UID);
if (value != null && !TextUtils.isEmpty(uid)) {
// uid不为空,获取用户信息
getUserInfo(platform);
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_fail));
public void onCancel(SHARE_MEDIA platform) {
LogUtils.i(TAG, &onCancel------&
+ Thread.currentThread().getId());
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_cancle));
ProgressDialogUtils.getInstance().dismiss();
* 获取用户信息
* @param platform
private void getUserInfo(final SHARE_MEDIA platform) {
mController.getPlatformInfo(LoginActivity.this, platform,
new UMDataListener() {
public void onStart() {
// 开始获取
LogUtils.i(&getUserInfo&, &onStart------&);
ProgressDialogUtils.getInstance().dismiss();
ProgressDialogUtils.getInstance().show(
LoginActivity.this, &正在请求...&);
public void onComplete(int status, Map info) {
String sns_id = &&;
String sns_avatar = &&;
String sns_loginname = &&;
if (info != null && info.size() != 0) {
LogUtils.i(&third login&, info.toString());
if (platform == SHARE_MEDIA.SINA) { // 新浪微博
sns = AppConstants.SINA;
if (info.get(AppConstants.UID) != null) {
sns_id = info.get(AppConstants.UID)
.toString();
if (info.get(AppConstants.PROFILE_IMAGE_URL) != null) {
sns_avatar = info
.get(AppConstants.PROFILE_IMAGE_URL)
.toString();
if (info.get(AppConstants.SCREEN_NAME) != null) {
sns_loginname = info.get(
AppConstants.SCREEN_NAME)
.toString();
} else if (platform == SHARE_MEDIA.QZONE) { // QQ
sns = AppConstants.QQ;
if (info.get(AppConstants.UID) == null) {
ToastUtils
.showShort(
LoginActivity.this,
getString(R.string.oauth_fail));
sns_id = info.get(AppConstants.UID)
.toString();
sns_avatar = info.get(
AppConstants.PROFILE_IMAGE_URL)
.toString();
sns_loginname = info.get(
AppConstants.SCREEN_NAME)
.toString();
} else if (platform == SHARE_MEDIA.WEIXIN) { // 微信
sns = AppConstants.WECHAT;
sns_id = info.get(AppConstants.OPENID)
.toString();
sns_avatar = info.get(
AppConstants.HEADIMG_URL)
.toString();
sns_loginname = info.get(
AppConstants.NICKNAME).toString();
// 这里直接保存第三方返回来的用户信息
SpUtils.putBoolean(LoginActivity.this,
AppConstants.THIRD_LOGIN, true);
LogUtils.e(&info&, sns + &,& + sns_id + &,&
+ sns_loginname);
// TODO: 这里执行第三方连接(绑定服务器账号)
} catch (Exception e) {
e.printStackTrace();
示例代码:SignUpActivity.java
package com.devilwwj.
import android.app.A
import android.os.B
import android.text.TextU
import android.util.L
import android.view.KeyE
import android.view.V
import android.view.View.OnClickL
import android.view.inputmethod.EditorI
import android.widget.B
import android.widget.TextV
import android.widget.TextView.OnEditorActionL
import com.devilwwj.loginandregister.utils.RegexU
import com.devilwwj.loginandregister.utils.ToastU
import com.devilwwj.loginandregister.utils.VerifyCodeM
import com.devilwwj.loginandregister.views.CleanEditT
* @desc 注册界面
* 功能描述:一般会使用手机登录,通过获取手机验证码,跟服务器交互完成注册
* Created by devilwwj on 16/1/24.
public class SignUpActivity extends Activity implements OnClickListener{
private static final String TAG = &SignupActivity&;
// 界面控件
private CleanEditText phoneE
private CleanEditText passwordE
private CleanEditText verifyCodeE
private Button getVerifiCodeB
private VerifyCodeManager codeM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
initViews();
codeManager = new VerifyCodeManager(this, phoneEdit, getVerifiCodeButton);
* 通用findViewById,减少重复的类型转换
* @param id
@SuppressWarnings(&unchecked&)
public final
E getView(int id) {
return (E) findViewById(id);
} catch (ClassCastException ex) {
Log.e(TAG, &Could not cast View to concrete class.&, ex);
private void initViews() {
getVerifiCodeButton = getView(R.id.btn_send_verifi_code);
getVerifiCodeButton.setOnClickListener(this);
phoneEdit = getView(R.id.et_phone);
phoneEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);// 下一步
verifyCodeEdit = getView(R.id.et_verifiCode);
verifyCodeEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);// 下一步
passwordEdit = getView(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
// 点击虚拟键盘的done
if (actionId == EditorInfo.IME_ACTION_DONE
|| actionId == EditorInfo.IME_ACTION_GO) {
private void commit() {
String phone = phoneEdit.getText().toString().trim();
String password = passwordEdit.getText().toString().trim();
String code = verifyCodeEdit.getText().toString().trim();
if (checkInput(phone, password, code)) {
// TODO:请求服务端注册账号
private boolean checkInput(String phone, String password, String code) {
if (TextUtils.isEmpty(phone)) { // 电话号码为空
ToastUtils.showShort(this, R.string.tip_phone_can_not_be_empty);
if (!RegexUtils.checkMobile(phone)) { // 电话号码格式有误
ToastUtils.showShort(this, R.string.tip_phone_regex_not_right);
} else if (TextUtils.isEmpty(code)) { // 验证码不正确
ToastUtils.showShort(this, R.string.tip_please_input_code);
} else if (password.length() & 6 || password.length() & 32
|| TextUtils.isEmpty(password)) { // 密码格式
ToastUtils.showShort(this,
R.string.tip_please_input_6_32_password);
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_verifi_code:
// TODO 请求接口发送验证码
codeManager.getVerifyCode(VerifyCodeManager.REGISTER);
登录注册的解决方案,笔者已经做成一个Demo放到github了,大家在实际开发的时候可以参考着根据自身的业务进行调整,但基本上不会差太多,第三方登录、验证码这个都可以选用第三方服务来实现,github地址如下:您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
《Android仿QQ微信开场导航以及登陆界面 - Mr梵谷的专栏 - 博客频道 - CSDN.NET》.pdf 12页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
《Android仿QQ微信开场导航以及登陆界面 - Mr梵谷的专栏 - 博客频道 - CSDN.NET》.pdf
你可能关注的文档:
··········
··········
Android仿QQ微信开场导航以及登陆界面 - Mr梵谷的专栏 - 博客频道 - CSDN.NET
您还未登录 !|
Mr梵谷的专栏
初涉A ndroid ,记录点滴的历程 ,
望菜鸟有朝一 日也可以蜕变为大神
个个人人资资料料
有奖征集活动系列—— 【HTML5游戏编程之旅】
专访许雪松:深入理解
探究云计算数据中心节能增效之道
客第一期云计算最佳博主评选
CSDN博客第二期最佳移动开发博主评选
Android仿QQ微信开场导航以及登陆界面
分类: 梵谷Android——UI篇
9572人阅读
eyu8874521
相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次
使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后进入应用,这一效果适用于多
种项 目中,相信今后开发应用一定会用得到。网路上也有不少这样的例子可以参考,不过看
别人的代码是一回事,自己实际做起来又是另一回事,今天的这个微信的Demo是研究过多个
类似的界面后自己动手去实现的效果,并且都加上了详细的注释(虽然有的多余) ,方便以后
访问:43208次
回顾一看就能看明白,只有真正亲自写一写,体会才会更深刻,例子中的图片都是在微信的
积分:1069分
APK中提取出来的,涉及到的知识点无外乎是ViewPager和Animation。
排名:第9643名
首先是开场闪屏的一个界面,使用handler控制该页面指定时间后进行跳转
原创:28篇
转载:10篇
评论:360条
文文章章分分类类
梵谷Android——UI篇 (8)
梵谷Android——功能篇 (8)
梵谷Android——技巧篇 (8)
梵谷Android——学习篇
正在加载中,请稍后...ul').hide()" onmouseenter="jQuery('.sitegroup>ul').show()">
绔嬪嵆鍏呭}

我要回帖

更多关于 对手行参与机构未登录 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信