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

简介: 用CC来AOP地实现登录成功后再跳转到目标界面功能

在掘金上看到这篇文章: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 {
   
    @Override
    public String getName() {
   
        return "demo.component.user";
    }

    @Override
    public boolean onCall(CC cc) {
   
        String actionName = cc.getActionName();
        // ... 
        // 强制获取用户信息,若未登录则跳转到登录,并将登录结果返回
        if ("forceGetLoginUser".equals(actionName)) {
   
            if (!TextUtils.isEmpty(Global.loginUserName)) {
   
                //已登录同步实现,直接调用CC.sendCCResult(...)并返回返回false
                CCResult 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为application
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            //将cc的callId传给Activity,登录完成后通过这个callId来回传结果
            intent.putExtra("callId", cc.getCallId());
            context.startActivity(intent);
            //异步实现,不立即调用CC.sendCCResult,返回true
            return true;
        }
        //...
        return false;
    }

}
  1. 模拟的登录页面:点击按钮模拟登录,直接返回文本框中的信息作为登录成功的信息,若未登录直接返回,则视为取消登录

    /**
    * 模拟登录页面
    */
    public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
         
    
     private EditText editText;
     private String callId;
    
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         
         super.onCreate(savedInstanceState);
         setContentView(R.id.activity_login);
         callId = intent.getStringExtra("callId");
         //init views
     }
    
     @Override
     public 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();
         }
     }
    
     @Override
     protected 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);
         }
     }
    }
    
  2. 在订单组件中进行登录验证:登录成功,则跳转到订单列表页;登录失败,则返回调用失败的结果

//订单组件
public class OrderComponent implements IComponent {
   
    @Override
    public String getName() {
   
        return "demo.component.order";
    }

    @Override
    public 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(...) 并且返回false
        CC.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 apps
            intent.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更优雅

目录
相关文章
|
5月前
|
存储 安全 前端开发
CC&LG实践|基于 LangGraph 一步步实现 Claude-Code 核心设计
本文旨在深入剖析 Claude-Code 的核心设计思想与关键技术实现,逆向分析其功能模块,结合 LangGraph 框架的能力,系统性地演示如何从一个最基础的 ReAct Agent 出发,逐步构建一个功能完备的简版 Claude-Code。
2971 19
CC&LG实践|基于 LangGraph 一步步实现 Claude-Code 核心设计
|
JSON JavaScript Java
CC框架实践(3): 让jsBridge更优雅
本文的侧重点是如何让我们的jsBridge不那么臃肿,实现得更优雅,更利于维护。
2026 0
|
ARouter Java Android开发
CC框架实践(2):Fragment和View的组件化
本文介绍了在CC组件化框架下实现Fragment及View组件化的方式,为android工程组件化的道路扫除一个障碍
1609 0
Adobe Photoshop CC 2019下载中文永久安装和破解教程
Adobe Photoshop CC 2019下载中文永久安装和破解教程
51196 0
Adobe XD CC 55.2.12.2 是一款非常专业的矢量图形规划软件Adobe XD 2023版本软件下载安装教程(内含所有版本)
Adobe XD CC 55.2.12.2 是一款非常专业的矢量图形规划软件,全新的桌面端UX原型工具,这是新一代网页与移动应用的UX设计工具。xd能够帮助设计者快速有效的设计图形、建立手机APP以及网站原型等等设计制作,支持设备的尺寸多样。集原型、设计和交互等功能于一体,从网站和移动应用程序到语音交互都可轻松实现,Adobe XD CC带来了响应调整大小、自动动画、语音原型、插件和应用程序集成等新功能,
AICC2019下载Adobe Illustrator CC 2019中文完整破解版免费下载与安装教程
AICC2019下载Adobe Illustrator CC 2019中文完整破解版免费下载与安装教程 在2018年10月15日,Adobe公司正式宣布Adobe Illustrator CC 2019更新之后,很多小伙伴都迫不及待的要下载使用,体验一下最新的功能,以及如何永久的使用它呢?那么接下来小编就带大家如何进行安装与永久使用的教程。
15469 1
Animate CC 2019免费下载丨Adobe Animate CC 2019下载中文完整版永久安装教程
Adobe 提供了一整套可互相配合使用的动画应用程序,助您实现所有创意。使用 Animate CC 创建适用于游戏、应用程序和 Web 的交互式矢量动画。利用 Character Animator CC 将人物实时制成动画。
8930 0
Adobe CC 2017全家桶破解
喜欢设计的同学,或者是懂一点设计的同学,再或者是知道PS的同学,大都知道一款软件叫做Photoshop,知道一家神奇的公司叫做Adobe。 我们在安装Adobe软件的时候,比如PS、PR、AE、AI等常用的软件,大都会在浏览器中打上"破解版"。
4553 0
|
人工智能
Adobe CC 2018全系列软件下载AdobeCC2018注册机破解教程
你好,很高兴你能看到我这篇教程经验,我叫尹训标,希望本教程能给你带来帮助,也希望能在你的学习上工作上对你有所帮助,这篇教程主要是讲我们如何正确安装Adobe系列所有的软件,以及永久破解的教程,还请大家一定要认真仔细阅读观看。
2735 0
|
Web App开发 数据安全/隐私保护
Adobe Photoshop CC中文版本注册安装教程
安装教程原文链接:https://www.yinxunbiao.com/9173.html 视频教程 Adobe Photoshop CC中文永久注册安装教程 PSCC版本_腾讯视频 https://v.qq.com/x/page/b07118gj9a1.html 链接复制到浏览器或者客户端观看1080P体验更清晰 Adobe Photoshop CC 链接:https://pan.baidu.com/s/1aWJfx_orh06MaQQWk4KWgw 密码:lbuj 图文教程 首先下载好我提供的软件,把他解压出来,得到一个安装包。
1783 0

热门文章

最新文章