写点什么

Android 组件化:stitch 框架,音视频开发书籍

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

依赖

//AS 3.0 之前使用 compile 'bamboo.component:stitcher:1.0'//AS 3.0 之后建议使用 implementation 'bamboo.component:stitcher:1.0'

组件生命周期管理

每个组件相当于 1 个 Module,许多组件的业务是需要在 App 启动时进行初始化的,比如运营商支付 sdk 基本都需要在 Application 的 onCreate 方法中进行初始化。


[stitch](


) 框架采用手动配置的方式,组件将自己注入到[stitch](


) 框架中,主工程再通过[stitch](


)框架对组件生命周期进行统一管理。


具体使用方法:

1. 继承 ComponentApplication

public abstract class ComponentApplication {//Application 对象注入 public void setApplication(Application application);


//控制组件的初始化顺序,参看 ComponentPrioritypublic int level();


//代理 Application 的 OnCreate 方法 public void onCreate();


//延迟初始化生命周期,用来注入页面以及数据交互接口 public void onCreateDelay(ComponentRouterRegistry routerRegistry, ActivityRouterRegistry activityRouterRegistry);


//代理 Application 的 attachBaseContext 方法 public void attachBaseContext(Context baseContext) ;


//代理 Application 的 onTrimMemory 方法 public void onTrimMemory(int level) ;


//代理 Application 的 onConfigurationChanged 方法 public void onConfigurationChanged(Configuration newConfig);


//代理 Application 的 onLowMemory 方法 public void onLowMemory();}


ComponentApplication 是组件生命周期的代理类,代理了 Application 的常用关键方法。如果组件在 App 启动时进行某些初始化或需要监听生命周期,通过 ComponentApplication 即可实现。

2. 在 Module 的 AndroidManifest.xml 中进行配置

<application>...<meta-dataandroid:name="bamboo.sample.account.component.AccountComponentApp"android:value="ComponentApplication" /></application>


特别要注意:meta-data 的 value 是 ComponentApplication,name 才是我们 module 的代理 Application 类。不要搞反了。

3. 主工程里面的自定义 Application 修改

在主工程 Application 里面我们需要主动调用组件的代理 Application 的方法,[stitcher](


)提供了两种方式:


1. 直接继承 StitcherApplication


public class MainApplication extends StitcherApplication {}


2. 通过 StitcherHelper 调用组件的生命周期。 参考 StitcherApplication。


public class StitcherApplication{public void onCreate() {super.onCreate();StitcherHelper.onCreate();}


public void onCreateDelay() {StitcherHelper.onCreateDelay();}


public void attachBaseContext(Context baseContext) {super.attachBaseContext(baseContext);StitcherHelper.init(this);StitcherHelper.attachBaseContext(baseContext);}


public void onTrimMemory(int level) {super.onTrimMemory(level);StitcherHelper. onTrimMemory(level);}


public void onLowMemory() {super.onLowMemory();StitcherHelper.onLowMemory();}


public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);StitcherHelper.onConfigurationChanged(newConfig);}}


通过上面几步,就能对组件的生命周期进行管理。


在使用页面交互以及数据交互之前我们先思考一个问题,这个问题是:


组件之间不能互相依赖,那如果要获取数据,我们就必须要借助于第三方 Module 进行中转。我们要怎么设计这个 Module 更方便呢?


没错,我们确实需要一个额外的 Module 来做交互中转,也就是路由 Module,如果以开发人员的角度来看,这个 Module 应该要具备以下几个因素: 1.方便 Module 管理自己的接口。 2.其他 Module 最好能实时看到我们的修改。


所以在介绍交互功能之前,我们需要先来实现这个路由 Module 的配置。

公用路由 Module 配置

1. 创建一个 Module:sampleouter
2. 修改 sampleouter 的 build.gradle 文件,在里面加入以下代码:

这一步的目的是为了把所有 Module 的 projectDir 的 router 文件夹都加入到 sampleouter 的源码文件夹中,这样一来,我们就能在自己的 Module 的 router 文件夹内管理自己对外公开的接口以及页面。


android {...sourceSets {main {//将所有 module 里的 router 文件夹都作为路由 module 的源码文件夹,方便 Module 开发时的方便 ArrayList<String> strings = new ArrayList<String>()File[] modules = rootDir.listFiles(new FileFilter() {boolean accept(File pathname) {return (pathname.isDirectory()&& pathname.name != "gradle"&& pathname.name != "build"&& !pathname.name.startsWith("."))}})for (File f : modules) {strings.add(f.absolutePath + File.separator + "router")}//不要忘了把原始的源码目录添加进来 string


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


s.addAll(java.srcDirs)java.srcDirs = strings}}}


配置完后,点一下 refresh 按钮,在 Module 里面创建 router 文件夹你会看到这样的效果。


3.在 Module 中配置 samplerouter 的依赖

implementation 'bamboo.component:stitcher:1.0'implementation project(":samplerouter")


OK,sampleouter Module 就配置好了,现在我们继续看页面交互要怎么实现。

页面交互

我们在讲述组件的生命周期管理时,可能你已经看到了组件生命周期代理类内有一个方法


//延迟初始化生命周期,用来注入页面以及数据交互接口 public void onCreateDelay(ComponentRouterRegistry routerRegistry, ActivityRouterRegistry activityRouterRegistry);


其中 ActivityRouterRegistry 就是我们进行页面交互的注册表,我们只需要将我们需要公开的页面注入到这里面就可以进行交互了。具体的实现步骤:

1. 在 router 文件夹里创建一个 TaskInfoPage.class 并继承 ActivityPage

package bamboo.sample.tasksrouter;


//每个对外公开的页面都对应一个 ActivityPage 的子类 public class TaskInfoPage extends ActivityPage {public final String taskId;public TaskInfoPage(Context context, String taskId) {super(context);this.taskId = taskId;}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android组件化:stitch框架,音视频开发书籍