【转】【可用】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 ...
随机推荐
- (原)Ubuntu16 中安装torch版的cudnn
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5668471.html 参考网址: https://devtalk.nvidia.com/default ...
- 飘逸的python - 多条件排序及itemgetter的应用
曾经客户端的同事用as写一大堆代码来排序,在得知python排序往往只需要一行,惊讶无比,遂对python产生浓厚的兴趣. 之前在做足球的积分榜的时候需要用到多条件排序,如果积分相同,则按净胜球,再相 ...
- 我的django之旅(一)
我的django之旅(一) 标签(空格分隔):django web 1.检验我们的python和django版本 liao@spring ~ $ python --version Python 2.7 ...
- python笔记之调用系统命令
python笔记之调用系统命令 目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数, ...
- C++之------运算符重载
① 什么是运算符重载? 何为C++的运算符重载呢? 其实就是运算符给它重新赋予新的含义或者多重含义.让它有另外一种新的功能. 为什么需要运算符重载? 面向对象中为了实现类的多态性,我们就引用了运算符 ...
- 【其他】IT公司的企业文化与竞争力
一直觉得三流企业靠成本竞争,二流企业靠体制竞争,一流企业靠文化竞争. 企业在竞争时候,总会提到一个词:核心竞争力.对于IT企业来说,核心竞争是什么?无论是技术也好,销售也罢,归根到底还是人才的竞争,优 ...
- Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)
一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...
- jdk8预览
原文:http://www.techempower.com/blog/2013/03/26/everything-about-java-8/ 1.接口增强 (1)接口可以定义static方法 java ...
- EF中读取随机数据的问题
_list.Where(a=>a.级别=="1").OrderBy(a => Guid.NewGuid()).Take(10);
- JavaScript 输入验证器工具
前注:在数据添加的时候很多地方都会涉及到数据的合法性验证,所以有必要提炼成为一个工具.今天偶然间点错网页,弹出一个游戏界面,本来是想看怎么实现的背景音乐的加载的,结果看到一个注册页面的验证JS,所以这 ...