【转】【可用】Android 登录判断器,登录成功后帮你准确跳转到目标activity
我们在使用应用时肯定遇到过这样的情景,打开应用,并不是需要我们登录,你可以浏览应用中的大部分页面,但是当你想看某个详情页的时候,点击后突然跳转到了登录页面,好,我们输入账号密码,点击登录,登录成功,跳转到了我们想看的详情页。
这一切看似很正常,但是有个关键点,就是当我们登录成功后能跳转到相应的详情页,我们正常的思维是登录成功后,在登录页面去做处理,写跳转,但是当你的应用有多个地方需要判断登录,登录成功后要跳转到各不相同的页面的时候,假如你还把跳转至各个页面的逻辑写在登录页面里,那么你的登录页面就会变得复杂起来,维护的成本就会越来越大。
思来想去,参考网上的思路终于找到了一种好的解决方式,就是当我们点击某个按钮需要判断登录的时候我们可以写一个登录判断器来判断是否登录,判断器携带一个登录载体,假如已登录就直接跳转到相应的目标Activity,假如没有登录就跳转到登录页面去登录,同时把登录载体传到登录Activity,登录成功后,在调用登录载体的相应方法直接跳转到目标Activity。好了,大体思路就是这样,下面我们来看看登录判断器到底做了些什么,还有就是什么是登录载体。
首先下面是登录判断器的代码:
package com.example.tool; import com.example.login.LoginActivity;
import com.example.login.MainActivity; import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast; /**
* 登录判断类
*
* @author bzl
*
*/
public class LoginInterceptor {
public static final String mINVOKER = "INTERCEPTOR_INVOKER"; /**
* 判断处理
*
* @param ctx
* 当前activity的上下文
* @param target
* 目标activity的target
* @param params
* 目标activity所需要的参数
* @param intent
* 目标activity
*
*/
public static void interceptor(Context ctx, String target, Bundle bundle, Intent intent) {
if (target != null && target.length() > 0) {
LoginCarrier invoker = new LoginCarrier(target, bundle);
if (getLogin()) {
invoker.invoke(ctx);
} else {
if (intent == null) {
intent = new Intent(ctx, LoginActivity.class);
}
login(ctx, invoker, intent);
}
} else {
Toast.makeText(ctx, "没有activity可以跳转", 300).show();
}
} /**
* 登录判断
*
* @param ctx
* 当前activity的上下文
* @param target
* 目标activity的target
* @param params
* 目标activity所需要的参数
*/
public static void interceptor(Context ctx, String target, Bundle bundle) {
interceptor(ctx, target, bundle, null);
} // 这里获取登录状态,具体获取方法看项目具体的判断方法
private static boolean getLogin() {
return MainActivity.is_login;
} private static void login(Context context, LoginCarrier invoker, Intent intent) {
intent.putExtra(mINVOKER, invoker);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
}
不难看出当我们跳转到目标activity的时候只需要在方法里调用interceptor(Context ctx, String target, Bundle bundle)方法就可以具体如下:
/*
* 跳转到目标activity页面
*/
public void starIntent(View v) {
Bundle bun = new Bundle();
bun.putString("Type", "login test");
LoginInterceptor.interceptor(this, "com.example.logininterceptor.SecondActivity", bun);
这里面需要三个参数依次是,当前activity的上下文,AndroidManifest.xml中目标activity的<intent-filter>下自定义的action,还有就是需要传进目标activity的参数我们使用Bundle传递。可以看出来我们登陆成功后跳转使用的事隐式Intent。结合代码来看进入到interceptor方法后,首先把关于目标activity的一些数据存放在登录载体LoginCarrier这个类中,然后判断是否登录,假如没有登录择跳转到登录activity去登陆并且将登录载体传到登录activity,假如已经登录择直接执行登录载体中的invoke();方法跳转到目标activity。好了,看一下登录载体:
package com.example.tool; import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable; /**
* 登录器载体
*
* @author bzl
*
*/
public class LoginCarrier implements Parcelable {
public String mTargetAction;
public Bundle mbundle; public LoginCarrier(String target, Bundle bundle) {
mTargetAction = target;
mbundle = bundle;
} /**
* 目标activity
*
* @param ctx
*/
public void invoke(Context ctx) {
Intent intent = new Intent(mTargetAction);
if (mbundle != null) {
intent.putExtras(mbundle);
}
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
} public LoginCarrier(Parcel parcel) {
// 按变量定义的顺序读取
mTargetAction = parcel.readString();
mbundle = parcel.readParcelable(Bundle.class.getClassLoader());
} @Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
} @Override
public void writeToParcel(Parcel parcel, int flags) {
// 按变量定义的顺序写入
parcel.writeString(mTargetAction);
parcel.writeParcelable(mbundle, flags);
} public static final Parcelable.Creator<LoginCarrier> CREATOR = new Parcelable.Creator<LoginCarrier>() { @Override
public LoginCarrier createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new LoginCarrier(source);
} @Override
public LoginCarrier[] newArray(int arg0) {
// TODO Auto-generated method stub
return new LoginCarrier[arg0];
}
};
}
登录器载体代码看着很多,其实仔细看他就是一个通过Parcelable方式序列化的一个实体类。我们来看重点看invoke(Context ctx)方法,很简单就是一个隐式跳转,直接跳转到目标activity,刚才在登录判断器中interceptor方法中判断已经登录的话则调用这个方法跳转到目标activity,没有登录的话跳转到登录界面并将登录器载体传过去,登录做的 东西很简单:
<span style="white-space:pre"> </span>private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:// 登录成功
invoker = (LoginCarrier) getIntent().getParcelableExtra(LoginInterceptor.mINVOKER);
invoker.invoke(LoginActivity.this);
finish();
break;
default:
break;
}
};
};
/*
* 点击登录,这个方法模拟登录成功直接发送消息
*/
public void login(View v) {
MainActivity.is_login = true;
/**
*
* do something to login
*/
handler.sendEmptyMessage(0);
}
可以看到在login方法中模拟登录成功后,我们获取登录器载体,同时执行登录载体中的invoke方法跳转到目标activity,然后在目标activity接收需要的参数,这里就不贴代码了。至此登录判断器的使命完成,以后我们就可以不用再将登录成功后的逻辑写到登录页面了。
【转】【可用】Android 登录判断器,登录成功后帮你准确跳转到目标activity的更多相关文章
- 单点登录(十七)----cas4.2.x登录mongodb验证方式成功后返回更多信息更多属性到客户端
我们在之前已经完成了cas4.2.x登录使用mongodb验证方式登录成功了.也解决了登录名中使用中文乱码的问题. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方 ...
- 针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题
一.针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题 首先,我们先来了解一下authc登录拦截器工作原理 authc拦截器有2个作用: 1>登录认证 请求进来时 ...
- Android实现点击通知栏后,先启动应用再打开目标Activity ,极光推送等推送的也可以参考一下(转)
我因为项目中集成了极光推送,推送的通知栏点开需要确定进入哪个界面就参考了这边文章,感谢作者的无私. 标签: 情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Servi ...
- Android实现点击通知栏后,先启动应用再打开目标Activity
情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Service,该Service在独立进程中运行,与服务器保持长连接,将服务器推送过来的消息在通知栏中显示,并设置点击 ...
- Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转
问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...
- dedecms自定义表单提交成功后提示信息修改和跳转链接修改
我们在用dedecms自定义表单提交成功后提示信息一般是"Dedecms 提示信息",这个要怎么改成自己想要的文字呢?还有就是提示页停留时间,目前估计就2秒,太快了,要如何设置长点 ...
- struts2拦截器拦截成功后每次请求都出现拦截时的错误信息
action中验证方法 在执行execute之前执行 @Override public void validate() { // TODO Auto-generated metho ...
- SpringBoot29 登录逻辑、登录状态判断
1 知识点扫盲 浏览器和服务器之间时通过session来确定连接状态的,浏览器第一次请求时服务端会自动生成一个session,并将这个sessionId传回给浏览器,浏览器将这个sessionId存放 ...
- IdentityServer4 登录成功后,跳转到原来页面
IdentityServer4 登录成功后,默认会跳转到Config.Client配置的RedirectUris地址http://localhost:5003/callback.html,用于获取 T ...
随机推荐
- 豆瓣FM duilib版
最近duilib项目被复制到了github上,仿佛又多了些活力.想要总结以前的项目的同时因为很喜欢豆瓣的FM,所以打算做个duilib版本豆瓣FM. 在网上了看到了很多豆瓣的不同版本,node.js. ...
- [C++程序设计]用指针变量作函数参数接收数组地址
#include <iostream> using namespace std; void select_sort(int *p, int n) { int i, j, k; ; i &l ...
- Java中操作时间比较好用的类
项目中经常用到日期的操作,包括日期的格式化.下面是几个比较常用的工具类. import java.text.SimpleDateFormat; import java.util.Date; impor ...
- Ext4 MVC CRUD操作
项目目录结构如下: (1)index.html <!DOCTYPE html> <html> <head> <title>用户管理</title& ...
- [转载] 50个Android开发人员必备UI效果源码
好东西,多学习! Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面A ...
- log4cplus配置文件使用
简介 log4cplus是log4j的c++移植版,是c++中一个很好的打印日志的库.它与另外一个c++的log库log4cxx相比较,好处是不依赖于libapr和libaprutil,可以静态链接到 ...
- Python打印格式化与字符串
关于Python打印格式化与字符串,比较全面的总结,希望对大家有帮助~ # -*- coding: cp936 -*- ''' 打印格式 ''' print "a" print & ...
- 转:Dynamic Binding Of RDLC To ReportViewer
Introduction I was struggling to find the solution to bind rdlc dynamically to reportviewer .We had ...
- 经验:Ubuntu 登陆 L2TP VPN
Ubuntu Linux 操作系统默认支持PPTP协议的VPN登陆,但是随着网络环境的复杂化,我们需要使用L2TP协议的VPN登陆,下面,我们只需要简单的几条命令即可登陆L2TP协议的VPN. ...
- UESTC_韩爷的情书 2015 UESTC Training for Graph Theory<Problem H>
H - 韩爷的情书 Time Limit: 6000/2000MS (Java/Others) Memory Limit: 262144/262144KB (Java/Others) Subm ...