模块 | CC | AutoRegister |
最新版本 |
原理介绍:Wiki
demo下载(包含主工程demo和demo_component_a组件)
demo_component_b组件单独运行的App(Demo_B)下载
以上2个app用来演示组件打包在主app内和单独以app运行时的组件调用,都安装在手机上之后的运行效果如下图所示
定义组件:将自身的业务(页面跳转及服务调用等)封装起来提供给外部调用,并返回执行的结果
调用组件:根据组件名称、业务名称及其它参数调用指定组件的指定业务,并获得执行的结果
组件将业务完全隔离在自身内部,仅暴露组件名称(ComponentName)、业务名称(actionName)、参数列表及返回值等信息给外部调用
1. 在根目录build.gradle中添加自动注册插件
2. 添加apply cc-settings.gradle文件
3. 实现IComponent接口创建一个组件
4. 使用CC.obtainBuilder("component_name").build().call()调用组件
组件以app方式独立运行时不需要依赖任何其它组件,从源头上隔离代码
无需担心与主app的相互调用,从一开始组件化改造就可以单组件运行
跟打包在主app中运行是一样的效果,能大大降低组件化改造的难度
了解业界开源的一些组件化方案:多个维度对比一些有代表性的开源android组件化开发方案
1. 支持组件间相互调用(不只是Activity跳转,支持任意指令的调用/回调)
2. 支持组件调用与Activity、Fragment的生命周期关联
3. 支持app间跨进程的组件调用(组件开发/调试时可单独作为app运行)
4. 支持app间调用的开关及权限设置(满足不同级别的安全需求,默认打开状态且不需要权限)
5. 支持同步/异步方式调用
6. 支持同步/异步方式实现组件
7. 调用方式不受实现方式的限制(例如:可以同步调用另一个组件的异步实现功能。注:不要在主线程同步调用耗时操作)
8. 支持添加自定义拦截器(按添加的先后顺序执行)
9. 支持超时设置
10. 支持手动取消
11. 编译时自动注册组件(IComponent),无需手动维护组件注册表(使用ASM修改字节码的方式实现)
12. 支持动态注册/反注册组件(IDynamicComponent)
13. 支持组件间传递Fragment、自定义View等(组件在同一个app内时支持、跨app传递非基础类型的对象暂不支持)
13.1 不仅仅是获取Fragment、自定义View的对象,并支持后续的通信。
14. 尽可能的解决了使用姿势不正确导致的crash,降低产品线上crash率:
14.1 组件调用处、回调处、组件实现处的crash全部在框架内部catch住
14.2 同步返回或异步回调的CCResult对象一定不为null,避免空指针
下面介绍在Android Studio中进行集成的详细步骤
在工程根目录的build.gradle中添加组件自动注册插件
buildscript {
dependencies {
classpath 'com.billy.android:autoregister:x.x.x'
}
}
apply plugin: 'com.android.library'
//或
apply plugin: 'com.android.application'
//替换成
apply from: 'https://raw.githubusercontent.com/luckybilly/CC/master/cc-settings.gradle'
//注意:最好放在build.gradle中代码的第一行
默认组件为library,若组件module需要以app单独安装到手机上运行,有以下2种方式:
module_name=true #module_name为具体每个module的名称
ext.runAsApp = true
创建组件(实现IComponent接口,需要保留无参构造方法)
public class ComponentA implements IComponent {
//需保留无参构造方法
@Override
public String getName() {
//组件的名称,调用此组件的方式:
// CC.obtainBuilder("ComponentA").build().callAsync()
return "ComponentA";
}
@Override
public boolean onCall(CC cc) {
Context context = cc.getContext();
Intent intent = new Intent(context, ActivityComponentA.class);
if (!(context instanceof Activity)) {
//调用方没有设置context或app间组件跳转,context为application
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
//发送组件调用的结果(返回信息)
CC.sendCCResult(cc.getCallId(), CCResult.success());
//返回值说明
// false: 组件同步实现(onCall方法执行完之前会将执行结果CCResult发送给CC)
// true: 组件异步实现(onCall方法执行完之后再将CCResult发送给CC,CC会持续等待组件调用CC.sendCCResult发送的结果,直至超时)
return false;
}
}
//同步调用,直接返回结果
CCResult result = CC.obtainBuilder("ComponentA").build().call();
//或 异步调用,不需要回调结果
String callId = CC.obtainBuilder("ComponentA").build().callAsync();
//或 异步调用,在子线程执行回调
String callId = CC.obtainBuilder("ComponentA").build().callAsync(new IComponentCallback(){...});
//或 异步调用,在主线程执行回调
String callId = CC.obtainBuilder("ComponentA").build().callAsyncCallbackOnMainThread(new IComponentCallback(){...});
更多使用方式请戳这里
状态码 | 说明 |
---|---|
0 | CC调用成功 |
1 | CC调用成功,但业务逻辑判定为失败 |
-1 | 保留状态码:默认的请求错误code |
-2 | 没有指定组件名称 |
-3 | result不该为null。例如:组件回调时使用 CC.sendCCResult(callId, null) 或 interceptor返回null |
-4 | 调用过程中出现exception,请查看logcat |
-5 | 指定的ComponentName没有找到 |
-6 | context为null,通过反射获取application失败,出现这种情况可以用CC.init(application)来初始化 |
-7 | 跨app调用组件时,LocalSocket连接出错 |
-8 | 已取消 |
-9 | 已超时 |
-10 | component.onCall(cc) return false, 未调用CC.sendCCResult(callId, ccResult)方法 |
不需要额外的混淆配置
源码:AutoRegister
原理:android扫描接口实现类并通过修改字节码自动生成注册表
CC攻击是指利用多个计算机或其他设备模拟真实用户的行为来进行刷流量的攻击行为。这种攻击的目的通常是为了使服务器的资源耗尽,从而使得服务器无法正常工作。CC攻击可以通过多种方式实现,例如利用计算机病毒或其他恶意软件来感染计算机,或者通过分布式网络来协调攻击。这种攻击可以针对各种类型的网站或服务,包括网上商店、新闻网站、社交媒体平台等。 CC 攻击(也称为“计算机资源滥用”)是一种攻击类型,其目的是通
CC攻击,全称Challenge Collapsar,是DDoS攻击的一种。CC攻击是目前应用层攻击的主要手段之一,借助代理服务器生成指向目标系统的合法请求,实现伪装和DDoS,其成本低、威力大,80%的DDoS攻击都是CC攻击。那么CC攻击的常用防护方式有哪些?以下是详细的内容介绍。 1、Web服务器端区分攻击者与正常访客 通过分析网站日志,基本可以分辨出哪个ip是CC攻击的,例如普
寄存器快速操作 其实可以直接赋值,相对好理解,但是熟练之后还是这个方法比较快。 一、只将寄存器中的某些位置1而不影响其它位 使用或操作 “|” 。 任何值与0相或,保持原值。 任何值与1相或,结果为1. 例如:寄存器TMP的当前值为0X62,要将第2、3、6位置1。C语言表达式:TMP|=0X4C。 0X62:0110 0010 0X4C:0100 1100 TMP= 0110 1110 那么这个
前言 一直对于cocos creator的action系统有着深深的埋怨,原因是用起来太麻烦了。习惯了Unity的Tween插件的用法,我也试着自己封装了下action系统,用起来像Tween那样,具体参照Cocos Creator 游戏开发之action缓动系统的封装,看到cocos creator 2.0.9版本的之后推出了tween,心中那是无比的欢乐啊。 关于Tween Tween 提供了
本文向大家介绍安卓GreenDao框架一些进阶用法整理,包括了安卓GreenDao框架一些进阶用法整理的使用技巧和注意事项,需要的朋友参考一下 大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一、查询指令整理 1.链式执行的指令 一般的查询语句会在中间xxx的位置加上各种判断和过滤的方法指令,除了最后的终结指令list()
有两种类型的框,信息框和小框。两个框均用于显示统计摘要。 信息框 <div class="info-box"> <span class="info-box-icon bg-info"><i class="far fa-envelope"></i></span> <div class="info-box-content"> <span class="info-box-text"
BAMS是一个完全开源的政企信息管理系统基础框架。它是轻量级的,简单易学的(学习成本真的很低,没有extjs,没有easyUI,没有繁琐的js UI库。只要java基础扎实,再稍懂一点js即可,真的是为java开发人员量身定制的一套框架啊),框架以Spring Framework为核心、Jsp+Dwr作为模型视图控制器、Hibernate作为数据库操作层。 BAMS已内置 一系列企业信息管理系统的
🕒 岗位/面试时间 9.27上午面试的 👥 面试题目 本人Java面试是突击准备的 锁 多线程,线程状态 线程通信 设计模式,我不太熟悉,被要求手撕安全单例模式,还是写出来了,顺便问了单例模式有什么不好的地方 问了我项目中的观察者模式,问我多个观察者怎么实现,我没写过,说的维护一个队列 生命周期,不太懂 垃圾回收,深挖了一些,没答好 容器以及hashmap,hashset实现原理,还有hash
了解如何以 Creative Cloud 会员资格下载并安装 Photoshop CC 或 CS6。包括完整计划、摄影计划和单个应用程序计划。 下载 Photoshop CC 欢迎使用 Photoshop CC!无论您购买的是完整计划、摄影计划还是单个应用程序计划,操作过程都是相同的。从 adobe.com 网站下载 Photoshop 并将其安装到桌面上即可。 转到 Creative Cloud
了解如何以 Creative Cloud 会员资格下载并安装 Photoshop CC 或 CS6。包括完整计划、摄影计划和单个应用程序计划。 下载 Photoshop CC 欢迎使用 Photoshop CC!无论您购买的是完整计划、摄影计划还是单个应用程序计划,操作过程都是相同的。从 adobe.com 网站下载 Photoshop 并将其安装到桌面上即可。 转到 Creative Cloud
问题内容: 当我在Android上运行使用Akka的应用程序时,收到以下异常: 在actor系统创建期间抛出此异常: 我以为proguard删除了一个构造函数,所以我在proguard.cfg中添加了以下行: 但这没有帮助。 我究竟做错了什么? 问题答案: 您的具有以下签名的构造函数之一不公开或不存在:
TCL移动开发面试 项目 支付项目中对接支付的大致流程 怎么保证支付的安全性 为啥没安卓经验要面试安卓呢?因为项目都是后台的 Java基础 字符串拼接的方式 如何理解线程安全问题 创建线程的方式 讲讲java中的锁 synchronized锁的实现原理,在项目当中哪里用到了加锁 synchronized和volitail的区别 volitail会被编译器优化嘛,synchronized会被编译器优