Linux编程点击右侧存眷,免费入门到精晓!

作者丨Android手艺干货分享

https://www.jianshu.com/p/73b4fc288dd8

1、媒介

比来因为买卖需求调换,有考虑采用组件化架构进行斥地,这方面我之前没有接触过。关于组件化的文章好多,各方大神更是提出了各类的组件化方案,我也看了好多相关文章。然则进修新器材看的再多,不如着手做一次,先不考虑复杂的器材,先着手做个简洁的Demo更有助于懂得组件化的思惟。废话不多说,直接着手开码。

2、搭建组件化Demo

先打开Android Studio新建一个项目。

步伐一: 新建config.gradle,统一治理build.gradle中的相关内容

然后在项目目录下新建一个config.gradle文件。

接着在这个文件内添加如下代码:

ext {

//applicationId版本号sdkVersion统一治理

android = [

compileSdkVersion        : 28,

buildToolsVersion        : 28,

applicationId            : "com.example.componenttestdemo",

minSdkVersion            : 19,

targetSdkVersion         : 28,

versionCode              : 1,

versionName              : "1.0",

testInstrumentationRunner: "android.support.test.runner.AndroidJUnitRunner"

]

//版本号

def APPCOMPAT_V7_VERSION = "28.0.0"

def CONSTRAINT_LAYOUT_VERSION = "1.1.3"

//三方库统一治理

dependencies = [

appcompatV7     : 'com.android.support:appcompat-v7:' + APPCOMPAT_V7_VERSION,

constraintLayout: 'com.android.support.constraint:constraint-layout:' + CONSTRAINT_LAYOUT_VERSION

]

}

因为我们知道项目使用组件化架构后,单一模块Module能够作为单个Application运行,同时也能够在整个主Application中作为一个Module运行。所以在config.gradle中先界说一个isModule来区别这两种情形,组件化之后能够经由点窜这个值来切换这两种情形的使用。剩下就是对applicationId、版本号、sdkVersion和三方库等进行统一治理。

接着点窜app下的build.gradle里设置内容

将本来的compileSdkVersion、applicationId、minSdkVersion、versionCode和三方库等替代成对应config.gradle中界说的值。

apply plugin: 'com.android.application'

android {

compileSdkVersion rootProject.ext.android.compileSdkVersion

defaultConfig {

applicationId rootProject.ext.android.applicationId

minSdkVersion rootProject.ext.android.minSdkVersion

targetSdkVersion rootProject.ext.android.targetSdkVersion

versionCode rootProject.ext.android.versionCode

versionName rootProject.ext.android.versionName

testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation rootProject.ext.dependencies.appcompatV7

implementation rootProject.ext.dependencies.constraintLayout

}

最后还要在项目目录下的build.gradle中添加一行:

apply from : "config.gradle"

然后点击Sync Now同步。最后在进行下一步前,新建一个MyApplication,在AndroidManifest设置name属性。

步伐二:建立Main模块,搬空app壳工程

我们知道组件化中需要一个app壳工程,这个壳工程中不处理任何买卖,就只是一个空壳,由它将所需要的各个组件模块组合起来,组成一个完整的应用。而如今项目中的app照样存在默认的进口Activity的,所以要新建一个ModuleMain将默认的MainActivity和其结构文件搬曩昔。

接着进入app的AndroidManifest文件将注册Activity的相关代码也搬到ModuleMain模块的AndroidManifest中去,只留下application标签。

这里注重组件化项目中每个Module都邑有本身的AndroidManifest文件,最后打包时会将这些文件归并成一个文件,所以会显现application标签中的属性反复问题,要在app的AndroidManifest文件中添加如下两行代码:

xmlns:tools="http://schemas.android.com/tools"

tools:replace="android:name,android:label,android:icon, android:theme,android:allowBackup"

这里的name、label、icon、theme、allowBackup都或者会有反复,所以悉数写上之间用逗号离隔。完整AndroidManifest如下:

package="com.example.sy.modulesimpledemo"

xmlns:tools="http://schemas.android.com/tools"    >

android:name=".application.MyApplication"

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

tools:replace="android:name,android:label,android:icon, android:theme,android:allowBackup"

android:theme="@style/AppTheme">

接着app壳工程中只剩刚点窜的build.gradle还没删减,在删减前先将app中build.gradle的内容复制笼盖到Main模块的build.gradle中,而且还要做部门点窜。因为单个组件能够作为一个组件模块被app壳工程组合使用,也能够零丁作为一个application使用。所以要凭据config.gradle中界说的isModule来判断是作为Module照样Applicaition。同样还有作为Module是不需要applicationId的而作为应用则是需要的。

//经由isModule来判断是application照样module

if (rootProject.ext.isModule) {

apply plugin: 'com.android.library'

} else {

apply plugin: 'com.android.application'

}

android {

compileSdkVersion rootProject.ext.android.compileSdkVersion

defaultConfig {

//是application才需要applicationId

if (!rootProject.ext.isModule) {

applicationId "com.example.sy.moduledmain"

}

minSdkVersion rootProject.ext.android.minSdkVersion

targetSdkVersion rootProject.ext.android.targetSdkVersion

versionCode rootProject.ext.android.versionCode

versionName rootProject.ext.android.versionName

testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

}

}

}

}

dependencies {

implementation fileTree(include: ['*.jar'], dir: 'libs')

implementation rootProject.ext.dependencies.appcompatV7

implementation rootProject.ext.dependencies.constraintLayout

}

这时modulemain中的AndroidManifest会提醒资源文件的贫乏,这时先将app中的对应文件复制到modulemain里来。

步伐三 :新建Application和AndroidManifest文件

在app壳工程和ModuleMain平分别新建一个Application,因为Moudule也是需要能够零丁运行的。

接着在ModuleMain里新建AndroidManifest文件,因为作为Module和Application是会有纷歧样的所以要做区分,在main目录下新建module文件夹和application文件夹离别存放两个情形下的AndroidManifest文件,将本来的AndroidManifest文件拖到module下,再拷贝一份到application下。拷贝完了记得在两个AndroidManifest里application标签下设置name属性。

接着再build.gradle中添加如下代码,用来离别在两种情形下指定使用哪个AndroidManifest。

sourceSets {

main {

if (rootProject.ext.isModule) {

manifest.srcFile 'src/main/module/AndroidManifest.xml'

} else {

manifest.srcFile 'src/main/application/AndroidManifest.xml'

java {

//清扫java/module文件夹下的所有文件

exclude '*module'

}

}

}

}

然后再到app的build.gradle中在dependencies内添加以下代码,用来引入ModuleMain模块。

if (rootProject.ext.isModule) {

implementation project(":modulemain")

}

如今能够再次点击Sync Now等同步竣事后,固然项目中只有一个壳工程和一个主Module,然则已能够看到组件化的雏形。此时已经能够经由点窜config.gradle里的isModule的值,进行Application和Module两种模式的切换,将ModuleMain作为app 的模块运行或许是零丁作为一个应用运行了。

步伐四:新建其他组件Module息争决资源文件辩说

接着按照新建ModuleMain的步伐反复新建其他买卖Module,这里我新建了3个Module,买卖A:ModuleA与买卖B:ModuleB和一个BaseModule。个中BaseModule首要存放一些根蒂类和对象类,只做为Module为上层买卖模块供应办事。

接下来解决资源文件辩说的问题,进入ModuleMain的build.gradle添加下面这行代码,为资源文件定名规范一个统一开首:

resourcePrefix "modulemain_"

添加后起名是没按照规范Android Studio就会有一个提醒:

按要求点窜文件名后提醒消散。

步伐五:使用ARouter进行组件间通信

接下来就要处理组件间的通信问题,采用阿里的ARouter。按照文档集成ARouter。(https://github.com/alibaba/ARouter)

首先在defaultConfig下添加如下代码:

javaCompileOptions {

annotationProcessorOptions {

arguments = [AROUTER_MODULE_NAME: project.getName()]

}

}

}

再引入ARouter依靠:

implementation rootProject.ext.dependencies.arouter

implementation rootProject.ext.dependencies.arouterCompiler

最后在Application中初始化ARouter:

if (isDebug()) {           // 这两行必需写在init之前,不然这些设置在init过程中将无效

ARouter.openLog();     // 打印日志

ARouter.openDebug();   // 开启调试模式(若是在InstantRun模式下运行,必需开启调试模式!线上版本需要封闭,不然有平安风险)

}

ARouter.init(mApplication); // 尽或者早,介绍在Application中初始化

如许ARouter就集成好了,接着在MoudleA和ModuleB中新建两个Activity,然后使用ARouter进行页面跳转。

ModuleMain中MainActivity.java:

public class MainActivity extends BaseActivity{

/**

* toA

*/

private Button mModulemainA;

/**

* toB

*/

private Button mModulemainB;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.modulemain_activity_main);

initView();

initEvent();

}

private void initEvent(){

mModulemainA.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

ARouter.getInstance().build(ARouterPath.PATH_MOUDULE_A).navigation();

}

});

mModulemainB.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

ARouter.getInstance().build(ARouterPath.PATH_MOUDULE_B).withString("key","传递的数据").navigation();

}

});

}

private void initView(){

mModulemainA = (Button) findViewById(R.id.modulemain_a);

mModulemainB = (Button) findViewById(R.id.modulemain_b);

}

}

ModuleA中ModuleAActivity.java:

@Route(path = ARouterPath.PATH_MOUDULE_A)

public class ModuleAActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.modulea_activity_module_a);

}

}

ModuleB中ModuleBActivity.java:

@Route(path = ARouterPath.PATH_MOUDULE_B)

public class ModuleBActivity extends AppCompatActivity{

@Autowired(name = "key")

String data;

/**

* TextView

*/

private TextView mTextViewB;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.moduleb_activity_module_b);

ARouter.getInstance().inject(this);

initView();

}

private void initView(){

mTextViewB = (TextView) findViewById(R.id.textViewB);

mTextViewB.setText(data);

}

}

运行结果:

这里看到模块之间界面通信正常,而且单个买卖模块也能够零丁运行,如许一个最根基的组件化架构Demo差不多就完成了。

3、将Module作为长途maven仓库

在斥地中,或者会把一些公用Module传到私有办事器上,然后在项目中直接依靠使用。下面就将Module上传到Github作为长途maven仓库,在项目直接引用。首先新建一个项目,建立一个UtilModule。

将本来项目中的对象类移到UtilModule中,接着在UtilModule的build.gradle中添加以下代码:

apply plugin: 'maven'

uploadArchives {

repositories.mavenDeployer {

def mavenDirPath = file('\\Users\\sy\\AndroidProjects\\UtilModule') // 内陆存放地址

repository(url:"file://${mavenDirPath.absolutePath}")

pom.project {

groupId "com.example.utilmodule" // 包名

artifactId "utilmodule" // module的名字

version "1.0.0" // 版本号

}

}

}

然后点击gradle中的uploadArchives:

进入设置的目录查察,aar已经打包好了。

接着打开Github建立一个新仓库:

按照Github上的号令,将内陆打包好的UtilModule上传到Github上:

上传完成后将仓库地址复制下来,将个中的github.com部门点窜为raw.githubusercontent.com再在结尾加上/master透露是主分支,添加到项目中的build.gradle中。

接着在到Module的build.gradle中添加依靠:

utilmodule      : 'com.example.utilmodule:utilmodule:' + UTIL_MODULE_VERSION

implementation rootProject.ext.dependencies.utilmodule

这里就是之前设置的包名:Module名:版本号。SyncNow之后删除本来项目中的对象类,然后在代码里使用长途仓库的对象类测试:

运行打印日志:

D/com.example.modulemain.MainActivity: onCreate:false

这解说长途仓库依靠成功已经能正常使用个中的类和方式。

4、总结

这篇文章首要是记录下我初识组件化,搭建组件化Demo的过程,Demo首要对于我对组件化思惟的懂得和体验照样很有匡助的,Demo中还有好多没考虑到的处所,好比Application的动态设置归并、Fragment、组件化的搅浑等等,也是我正在进修的问题。这篇文章首要供和我一般对组件化这块不太认识的新手做参考,进展能对新手有所匡助。

介绍↓↓↓

android给组件加上id,Android组件化入门:一步步搭建组件化架构相关推荐

  1. android子view获取父布局,Android获取布局父ID(Android get layout parent id)

    Android获取布局父ID(Android get layout parent id) 我想知道View和ViewParent有什么区别? 我想获取ImageView父级的Id,但我不能这样做: m ...

  2. android 组件的id,Android@id和@+id的区别 - 泡在网上的日子

    Android中的组件需要用一个int类型的值来表示,这个值就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例�[email protected]/abc.@+id ...

  3. android textview 常用属性id,Android TextView常用属性

    [说明] TextView是用来显示文本的组件.以下介绍的是XML代码中的属性,在java代码中同样可通过 "组件名.setXXX()方法设置.如,tv.setTextColor(); [属 ...

  4. android listview 列加id,Android实战开发之ListView同一个item显示2列的实现方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用List ...

  5. android 耳机 音量调节 id,Android链接耳机音量到主音量

    据我所知,这是飞利浦Android TV用户的常见问题(例如 this篇中的第22页,或 that讨论). 一般来说,您的任务的模板是跟踪插入/拔出事件和"系统/音乐"音频流(或媒 ...

  6. android+usb转串口+唯一id,Android平台3G模块驱动移植-USB转串口

    Android平台3g模块是通过ril库来支持数据.短信.彩信.电话.第三方通话.USSD等功能的.其相应的组件有:rild用来为rild socket建立文件,pppd和chat为拨号文件,libr ...

  7. android获取子线程id,Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID

    /*** Returns the identifier of this process's user. * 返回此进程的用户的标识符.*/Log.e(TAG,"Process.myUid() ...

  8. android 有哪些设备id,Android之设备ID(Device ID)

    有时,Android应用程序开发过程中需要得到基于Android智能手机设备的唯一ID .特别是在需要唯一标识设备注册的情况下,Device ID就非常有用.今天我就整理一下Device ID有哪些方 ...

  9. android 耳机 音量调节 id,Android音频相关(一)插入耳机后调节音量(安全音量)...

    一.安全音量提醒框的开启 二.修改安全音量提醒框显示 三.重启后还会显示安全音量提醒框 四.一些关于安全音量的初始值 一.安全音量提醒框的开启 安卓系统是有耳机音量保护机制的,对于一些出口欧盟的手机来 ...

最新文章

  1. 如何设计四象限电压转换电路?
  2. crt中 新建的连接存储在哪_连接昌邑路和浦东大道,这条新建道路的规划设计方案公示中...
  3. JSP简单练习-使用JDOM创建xml文件
  4. 转载:linux安装rlwrap软件包
  5. 汉三水属国(北地属国、安定属国)
  6. java学习(25):三目运算符
  7. javascript 校验 非空_Javascript的表单与验证-非空验证
  8. 【kafka】kafka 消费 带有 kerberos认证的服务器
  9. php打印订单,WooCommerce: 打印订单
  10. 我们能用RNN写策略吗?
  11. 人民币大写金额转换为数字
  12. 「 墙裂推荐」互联网人必备GIF制作的14种选择
  13. 大数据学习中虚拟机准备工作(centos基础配置)
  14. C++17 文件与目录操作 <filesystem>
  15. Python基础教程(英文视频教学)
  16. 技术里的故事里的技术
  17. 每日分享之《生命树》
  18. 网站信息被恶意篡改如何解决?
  19. 3ds max材质库操作
  20. Linux网络测试与配置

热门文章

  1. Scala通过office365的SMTP服务发送邮件
  2. 林业调查规划设计资质分省份和全国
  3. 搜狗浏览器论坛下线通告:10月18日停止服务
  4. DWG文件的预览图像数据结构
  5. NavigationBar左侧布局方案探索一
  6. 学习java的心得感悟--Linux的文件操作命令
  7. pkill 命令_pkill和pgrep:流程管理命令
  8. 算法:通过普利姆(Prim)算法,求出图的最小生成树
  9. 【论文笔记】监控视频中异常事件检测及异常事件摘要
  10. Linux中安装Jenkins