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

在掘金上看到这篇文章: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更优雅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yum search php7,yum install php7 in centos6

如果有安装的PHP包,先删除他们yum list installed | grep phpyum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64yum 安装我们需要的软件1.安装epel软…

CentOS 7系统安装配置图解教程

操作系统:CentOS 7.3 备注: CentOS 7.x系列只有64位系统,没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 一、安装CentOS 7.3 成功引导系统后,会出现下面的界面 界面说明: Install CentOS 7 #安装…

这份《.NET/C#面试手册》超神啦!

这几天给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏&#…

Dinic算法----最大流常用算法之一

——没有什么是一个BFS或一个DFS解决不了的;如果有,那就两个一起。 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用。 竞赛中常用的$Dinic$算法和$SAP$,其实也不太难。 那么,$Dinic$算…

springcloud~Eureka实例搭建

服务端 build.gradle配置 dependencies {compile(org.springframework.cloud:spring-cloud-starter-netflix-eureka-server)testCompile(org.springframework.boot:spring-boot-starter-test) }dependencyManagement {imports {mavenBom "org.springframework.cloud:sprin…

php5.3教程,Php 5.3发布

PHP 5.3.4 特性: 增加对zip 流的统计支持 新增 follow_location (默认启用)支持 增加一个 3rd parameter to get_html_translation_table Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect zend multibyte at runtime. Multiple improvements t…

javascript学习笔记 null和undefined

null是javascript语言的关键字,它表示一个特殊值,常用来描述“空值”。对null执行typeof预算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”。但实际上&#xff0…

C# 为什么高手都是用IsNullOrWhiteSpace对字符串判空?

判断字符串为空有好几种方法:方法一: 代码如下:static void Main(string[] args){string str "";if (str ""){Console.WriteLine("a is empty"); ;}Console.ReadKey();}运行结果:a is empty这样…

使用bcftools提取指定样本的vcf文件(extract specified samples in vcf format)

1、下载安装bcftools。 2、准备样本ID文件,这里命名为samplelistname.txt,一个样本一行,如下所示: sample1 sample2 sample3 3、输入命令: bcftools view -S samplelistname.txt /1000genomes/ALL.chr16.phase3_shapei…

iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多...

iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某…

php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些

MySQL和SQL之间的区别有哪些?很多PHP的初学者,对MySQL,MyAdmin和SQL有什么区别并不是很清楚?下面 第一PHP社区 就带领大家来学习一下MySQL和SQL之间的区别。【推荐阅读:MySQL什么意思】一:什么是SQLSQL是一…

Blazor University (51)依赖注入 —— 拥有多个依赖项:错误的方式

原文链接:https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/拥有多个依赖项:错误的方式OwningComponentBase[1] 类是一个合适的解决方案,当我们需要我们的组件…

Centos的yum源更换为国内的阿里云源

1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repo…

Centos 7 搭建.net web项目

现在的.NET Core 1.0版本是一个很小的核心,APIs和工具也并不完整,但是随着.Net Core的不断完善,补充的Apis和创新也会一起整合到.NET Framework中。 安装centos系统 请自行安装或百度教程 安装 libicu包 和 dotnet 温馨提示:如果需…

Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法笔记-协议与分类...

23、通过委托与数据源协议进行对象间通信 如果要在委托对象上调用可选方法,那么必须提前使用类型信息查询方法判断这个委托对象能否响应相关选择子。 if ( [_delegate respondsToSelector:selector(networkFetcher:didReceiveData:)]){ [_delegate networkFetcher:s…

用matlab求解工作时间调度问题,置换流水车间调度问题的MATLAB求解.doc

物流运筹实务课程设计题目:置换流水车间调度问题的MATLAB求解置换流水车间调度问题的MATLAB求解目录前言……………………………………………………………………… 5问题描述………………………………………………………………… 6算法设计…………………………………

EntityFrameworkCore 模型自动更新(上)

【导读】嗯,距离上一次写博文已经过去近整整十个月,还是有一些思考,但还是变得懒惰了,心思也不再那么专注,有点耗费时间,学习也有点停滞不前,那就顺其自然,随心所欲吧,等…

IDEA 快捷注释

1. 新建类的注释模板 1) File->settings->Editor->Live Templates 2) 点击绿色号,选择template group ,输入group的name,然后点ok 3) 选中刚才添加的group,点击号,选择live Template 4) 代码模板位置,个人用的代码: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函数-hidden函数

1、hidden函数:设置或取消隐藏线模式2、用法说明(1)hidden on 函数对当前图形打开隐藏线条删除,使网格图后面的线条被前面的线条遮住。设置曲面图形对象的属性FaceColor为坐标轴背景颜色;(2)hidden off 函数对当前图形关闭隐藏线条删除&#…

java高级----Thread之CyclicBarrier的使用

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。今天我们就学习一下CyclicBarrier的用法。 CyclicBarrier的简单使用 类CyclicBarrier不仅有CountDownLatch所具有的功能,还可以实现屏…