组件(功能导向):单一的功能 组件,如视频组件,支付组件,路由组件
模块(业务导向):独立的业务模块,如首页模块,直播模块,IM模块。
粒度上,模块大于组件,二者思想一致:代码复用,业务解耦。
组件化优势:
1.避免重复造轮子,提高复用性,节约成本,提升开发效率。
2.项目间共用组件,可以确保整体技术的统一性。
3.为插件化共用一套底层模型做准备。
模块化优势:
1.业务解耦,移植简单。
2.多团队可以根据业务并行开发和测试。
3.单个业务可以独立打包,提高编译速度。
4.多项目共用模块,降低开发成本。
APP最终只允许一个AndroidManifest,众多module均有AndroidManifest会合并的,合并原则:
合并后会自动补全一些属性:icon,theme等,且name路径会改为全路径(包名+文件名),直接 android:name =".im.ChatActivity"的形式,有可能导致找不到文件。
1.主module无自定义application,功能module有自定义application,引用功能module中的自定义application;
2.主module和功能module均有自定义application,解决冲突,最终引用 主module中的自定义application;
最后汇总,会剔除不同功能module之间重复申请的权限,别担心重复申请,每个权限只会申请一次的。也可以把权限全部写到BaseModule中。
Activity主题各模块独立,用模块自己的定义的主题,不定义就是默认;
Application theme主题,参考最终full AndroidManifest中的主题。
与Activity相同。
通过声明SharedUserId,拥有同一个UserId的多个app可以配置成运行在同一个进程中,所以默认可以互相访问任意数据。
但是功能module中声明都是白扯,只有在主module(Application module)中声明shareUserId才能被打包到full AndroidManifest中。
application比activity创建的早,且生命周期最长,单例存在。
重要方法介绍:
onCreate()早于activity创建;
onTerminate()程序终止时调用,但不一定会被调用,系统杀死app时,不会提醒,也不会调用该方法;
onLowMermory()后台程序已终止,且资源仍匮乏时,会调用该方法,一般来说,在这里会释放一些不必要的资源占用,来应付紧张。
onConfigurationChanged()配置改变时触发,最常见的就是旋转屏幕。
最重要的方法:App内所有Activity的生命周期的监听。
registerActivityLifecycleCallbacks()和unregisterActivityLifecycleCallbacks()
例如获取栈顶Activity对象。(对于dialog至关重要)
组件化中,多个module均有application,编译时会报错,AS的Gradle插件默认会启用Manifest Merger Tool,如果Library中也定义了与主项目相同的属性(例如默认生成的icon和theme)合并就会失败。
解决编译,失败可以使用tools :replace = “android:icon,android:theme”,注意多个属性用逗号分开。并且在Manifest根标签加上 xmlns:tools=“http://schemas.android.com/tools”。否则会找不到域名。