Android 组件化:stitch 框架,音视频开发书籍
依赖
//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
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;}
评论