在掘金上看到这篇文章:android 关于先登录成功后再进入目标界面的思考,作者对实现登录成功后再跳转到目标界面功能作了比较详细的分析,对比了一些已有的实现方案并指出存在的问题。最终,作者实现了一个可同时添加多个条件判断拦截的方案,思路很新颖。

这篇文章的阅读量和喜欢数都很多,看来大家对这个需求的关注度很高,这里将我们在使用 CC框架 过程中实现这个功能的方案跟大家分享一下。

快速了解CC

  • 是一套基于组件总线的组件化实施方案
  • 一静一动,开发时运行2个app,业务环境始终是完整的:

    • 静:主App (通过跨App的方式调用单组件App内的组件)
    • 动:正在开发中的单组件App (通过跨App的方式调用主App内的组件)
  • 支持渐进式组件化改造

    • 解耦只是过程,而不是前提

CC框架基因中自带支持组件层面的AOP

在定义组件时,实现IComponent.onCall(cc)方法,并根据cc中的参数来执行组件中的具体逻辑(如:页面跳转等)。

可以在调用具体逻辑之前对该功能进行AOP实现,例如:登录、页面数据预加载等

用CC框架实现必须先登录再进入目标页面功能

目标页面所在的组件在执行页面跳转前调用登录组件(用户中心组件)获取用户信息,若未登录则登录后返回用户信息。

这里有2个点:
1. 若用户已登录,则直接返回用户信息,同步方式实现即可
2. 若用户未登录,则跳转到登录页面,需要执行完登录操作(或取消)后才能获得结果,使用异步方式实现。

以打开订单列表页面前需要登录为例:

  1. 先定义用户组件,提供一个强制获取用户登录信息的功能,若未登录则打开登录界面,并在用户登录后返回登录结果(取消登录也是一种结果)
//用户中心组件类
public class UserComponent implements IComponent {@Overridepublic String getName() {return "demo.component.user";}@Overridepublic boolean onCall(CC cc) {String actionName = cc.getActionName();// ... // 强制获取用户信息,若未登录则跳转到登录,并将登录结果返回if ("forceGetLoginUser".equals(actionName)) {if (!TextUtils.isEmpty(Global.loginUserName)) {//已登录同步实现,直接调用CC.sendCCResult(...)并返回返回falseCCResult result = CCResult.success(Global.KEY_USERNAME, Global.loginUserName);CC.sendCCResult(cc.getCallId(), result);return false;}//未登录,打开登录界面,在登录完成后再回调结果,异步实现Context context = cc.getContext();Intent intent = new Intent(context, LoginActivity.class);if (!(context instanceof Activity)) {//调用方没有设置context或app间组件跳转,context为applicationintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}//将cc的callId传给Activity,登录完成后通过这个callId来回传结果intent.putExtra("callId", cc.getCallId());context.startActivity(intent);//异步实现,不立即调用CC.sendCCResult,返回truereturn true;}//...return false;}}
  1. 模拟的登录页面:点击按钮模拟登录,直接返回文本框中的信息作为登录成功的信息,若未登录直接返回,则视为取消登录
/*** 模拟登录页面*/
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {private EditText editText;private String callId;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.id.activity_login);callId = intent.getStringExtra("callId");//init views}@Overridepublic void onClick(View v) {//模拟登录:点击按钮获取文本框内容并作为用户登录信息返回String username = editText.getText().toString().trim();if (TextUtils.isEmpty(username)) {Toast.makeText(this, R.string.demo_b_username_hint, Toast.LENGTH_SHORT).show();} else {//登录成功,返回Global.loginUserName = username;finish();}}@Overrideprotected void onDestroy() {super.onDestroy();//判断是否为CC调用打开本页面if (callId != null) {CCResult result;if (TextUtils.isEmpty(Global.loginUserName)) {result = CCResult.error("login canceled");} else {result = CCResult.success(Global.KEY_USERNAME, Global.loginUserName);}//为确保不管登录成功与否都会调用CC.sendCCResult,在onDestroy方法中调用CC.sendCCResult(callId, result);}}
}
  1. 在订单组件中进行登录验证:登录成功,则跳转到订单列表页;登录失败,则返回调用失败的结果
//订单组件
public class OrderComponent implements IComponent {@Overridepublic String getName() {return "demo.component.order";}@Overridepublic boolean onCall(CC cc) {CCResult result = CC.obtainBuilder("demo.component.user").setActionName("forceGetLoginUser").build().call();CCResult ccResult;// 根据登录状态决定是否打开页面// 这里也可以添加更多的前置判断逻辑if (result.isSuccess()) {ccResult = CCResult.success();//登录成功,打开目标页面startOrderListActivity(cc);} else {//登录失败,返回失败信息ccResult = result;}//调用方不需要获得额外的信息,只需要知道调用状态//所以这个组件采用同步实现:同步调用CC.sendCCResult(...) 并且返回falseCC.sendCCResult(cc.getCallId(), ccResult);return false;}private void startOrderListActivity(CC cc) {Context context = cc.getContext();Intent intent = new Intent(context, OrderListActivity.class);if (!(context instanceof Activity)) {// context maybe an application object if caller dose not setContext// or call across appsintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);}
}

至此,打开订单页面必须登录的功能已全部完成。

这样实现的好处

  1. 登录组件只管登录自身的逻辑,跟其它逻辑完全不耦合
  2. 调用订单组件的地方无需添加额外的代码
  3. 可以添加任意的前置条件判断
  4. 登录条件的判断可用于任意组件而无需修改登录组件的逻辑
  5. 支持跨app组件调用时的前置条件判断

了解更多关于CC框架的信息

Github源码 ,持续维护更新中, 欢迎watch、fork、star、pr、提issue

系列文章

CC:基于组件总线的Android组件化开源框架

CC框架实践(1):实现登录成功再进入目标界面功能

CC框架实践(2):Fragment和View的组件化

CC框架实践(3): 让jsBridge更优雅

CC框架实践(1):实现登录成功再进入目标界面功能相关推荐

  1. Tkinter实现登录成功后进入主界面

    今天我们来用tkinter实现一下登录,然后进入软件界面的操作,核心就是用到一个方法wait_window(window=None) 话不多说直接撸代码. '''先写个登录框框吧,直接上函数吧,类真的 ...

  2. 用php写登录成功后的界面,登录成功后跳转_php如何实现登录成功后跳转页面

    摘要 腾兴网为您分享:php如何实现登录成功后跳转页面,指南针,优软商城,优美图,天天美剧等软件知识,以及蓝光mp3剪切器,微信6,scandallpro,新页生产管理软件,asmr音频,lc标签打印 ...

  3. Vue3+Element-Plus 登录成功后主页退出功能实现 十八

    1. 退出功能的实现 1.1 退出功能实现的原理 ㈠ 如果是基于token的方式记录用户的登录信息,那么实现退出功能,只需要销毁保存在本地的token 即可.这样用户后续的请求就不会携带token,必 ...

  4. 一个可以添加商品、查询商品的程序,登录成功的话,再去操作,添加、查询商品,添加商品也是写在文件里面...

    #写一个可以添加商品.查询商品的这么程序#1.先登录,登录的用户名和密码都是写在文件里面的#1.读文件.字符串分割#2.登录成功的话,再去操作,添加.查询商品,添加商品也是写在文件里面#1.读写文件, ...

  5. 《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》——3.3 微信开发者中心...

    本节书摘来自华章计算机<微信公众平台开发:从零基础到ThinkPHP5高性能框架实践>一书中的第3章,第3.3节,作者 方倍工作室,更多章节内容可以访问云栖社区"华章计算机&qu ...

  6. java shiro登录实例_Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  7. dubbo协议_Dubbo协议解析与OPPO自研ESA RPC框架实践

    本文来自OPPO互联网基础技术团队,转载请注名作者.同时欢迎关注我们的公众号:OPPO_tech,与你分享OPPO前沿互联网技术及活动. 1. 背景 Dubbo是一款高性能.轻量级的开源Java RP ...

  8. vue-element-admin/template+tornado(pyrestful)前后端分离框架实践(1)——自定义菜单和仪表盘

    0. 写在前面 vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现.它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证, ...

  9. 《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》——1.2 微信公众账号注册...

    本节书摘来自华章计算机<微信公众平台开发:从零基础到ThinkPHP5高性能框架实践>一书中的第1章,第1.2节,作者 方倍工作室,更多章节内容可以访问云栖社区"华章计算机&qu ...

最新文章

  1. Packet Tracer 5.0配置cisco路由器详细说明
  2. 算力限制场景下的目标检测实战浅谈
  3. 设计模式笔记之五:观察者模式
  4. 前端面试题整理【转】
  5. 前端学习(1896)vue之电商管理系统电商系统之修改用户状态
  6. 微软ping程序源代码完整版(附详细的注释)
  7. trafficserver records.config参数说明
  8. 关于java中main方法为什么必须是静态的
  9. git pull 出错,error: Your local changes to the following files would be overwritten by merge...
  10. linux各路径(目录)的解释(转载)
  11. VIM之taglist
  12. HbuilderX连接夜神模拟器教程
  13. Photoshop - 教您怎样对扫描文件去除底色?
  14. 免费试用腾讯云服务器 + nginx建网站
  15. Android实现3DTouch效果
  16. Macbook删除苹果系统,装单系统win10系统
  17. docker下搭建fastfds集群版
  18. 【转】人脸识别图像库
  19. 只需这10招,强壮骨骼到老非你莫属
  20. Java资源大全中文版

热门文章

  1. gettimeofday函数
  2. Shell 快速入门
  3. 跨库一致性_设计跨平台的一致性
  4. Lerna 运行流程剖析
  5. Python: 反方向迭代一个序列
  6. 黑客窃取思科、IBM与甲骨文认证管理系统内的敏感数据
  7. 关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和使用...
  8. HttpCookie
  9. Mysql不同存储引擎的表转换方法
  10. java参数化查询_小博老师解析Java核心技术 ——JDBC参数化查询(二)