对于App端来说,如果能保证用户在登录后能自动延续登录前的操作,将是非常不错的用户体验。所以专门花了点时间,想了两种方式来实现该种需求。
这篇文章讲先第一种方式,这种方式实现的思路大致是这样:
在执行需要登陆状态的操作时,将该操作交由拦截器处理,该拦截器会把该操作延后到登陆成功后处理。
举个例子,用户想查看个人资料,通常的做法是先判断登录与否,如果没有登录,得先去登录,然后从登录页返回后在onActivityResult中再执行相应的跳转。但如果使用拦截器后,你只需将个人资料页必要的信息(比如标记activity的action)传给拦截器,拦截器经过处理后,再跳到个人资料页,这样你只需要关心你原有的需求,查看个人资料即可。
接下来看代码:
public void jumpToActivity(Context ctx, String target, Bundle params) { jumpToActivity(ctx, target, params, new Intent(ctx, getLoginClass())); } /** * * @param ctx * @param target * 目标activity的action * @param params * 需要传给目标activity的参数 * @param loginIntent * 带参数的指向登录页的intent */ public void jumpToActivity(Context ctx, String target, Bundle params, Intent loginIntent) { if (TextUtils.isEmpty(target) || loginIntent == null) throw new RuntimeException("No target activity."); JumpInvoker invoker = new JumpInvoker(target, params); if (logon()) { invoker.invoke(ctx); } else { loginIntent.putExtra(INVOKER, invoker); loginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(loginIntent); } }
代码JumpInvoker对象是登录成功后的逻辑执行者,它会被传输到登录模块中,在登录成功后执行invoke方法跳到指定页面,见代码:
@Override public void invoke(Context ctx) { Intent it = new Intent(mTargetAction); it.putExtras(mData); it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(it); }
使用方式:
1.在登录成功的地方获利Invoker对象,调用Invoker.invoke方法。
Invoker invoker = getIntent().getParcelableExtra(Interceptor.INVOKER); invoker.invoke(getApplicationContext());
2.需要跳转到登录后显示的Activity时,可使用代码中的jumpToActivity方法,将目标页的action及参数(非必须)传进即可。
源码与jar包见附件,其中只实现在登录跳转的逻辑。对于其它需求,比如收藏点击,在登录后自动收藏,也可以参照实现Interceptor与Invoker接口即可。
本文出自 “Android Pool” 博客,请务必保留此出处http://yeerik.blog.51cto.com/10547727/1681729
原文地址:http://yeerik.blog.51cto.com/10547727/1681729