如何搭建一个组件化框架

Android 高级工程师进阶 ~ 网易云课堂 学习笔记

实现分架构、分业务进行快捷开发,你需要掌握的核心架构

【课程主题】BAT大型安卓项目的开发之旅-组件化架构

【课程大纲】

1、做到快捷稳定、分架构、分业务进行敏捷开发

2、实现代码,资源的完全隔离,避免无意间调用

3、实现多人协作开发,提高开发效率

组件化架构

在这里插入图片描述

什么是组件化?
项目发展到一定的程度,随着业务和人员的增多,代码会越来越臃肿,维护难度越来越大,这时候就必须
将模块拆分成更小的组件,达到降低耦合,代码复用的目的

相比模块而言,组件化偏功能导向,颗粒度更小,模块偏业务导向,一个模块可以包含多个组件。

组件化使用场景
几乎任何项目都可以进行组件化开发,尤其适合业务功能复杂的大型项目

大型企业,实现团队协作开发项目

组件化优点:
实现代码解耦,复用,是代码更加清晰
有利于团队协作开发,开发人员之间职责明确,互不干扰
加快编译速度,提高开发效率,降低项目维护难度。

组件化不足
在Application 与 Library 之间切换时,对一些注入框架支持不友好,比如 ButterKnife
作为Application运行时,不适合在Application中定义方法。

组件化需要解决的问题

1,统一管理项目开发环境
使用gradle.properties 配置编译环境属性,例如 compileSdkVersion 等

2,组件需要满足单独运行与调试的要求
可以作为一个Application单独运行与调试

3,实现组件之间的界面跳转和数据传递
为组件创建中间层接口,每个组件需要提供各自的实现

4,组件相互之间的集成调试,包括只依赖部分组件
在 gradle.properties 中配置组件是否独立运行属性,通过调整属性值为 false实现集成调试

5,组件中Application的使用
在APP 组件中通过反射实例化组件的Application对象

6,组件之间实现代码隔离,资源文件隔离
在APP组件中使用runtimeOnly 依赖组件实现代码隔离,在组件中使用resourcePrefix '组件名_'实现资源文件隔离。

先创建 两个 module A 比如 logincomponent moduleB 比如 minecomponent
创建 一个 baselibrary 比如 componentlib2

课程地址:
https://study.163.com/course/courseLearn.htm?courseId=1209338869#/learn/live?lessonId=1279077413&courseId=1209338869

直接撸代码 :

组件化项目整体结构

在这里插入图片描述

componentlib2 library项目结构

在这里插入图片描述

build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28



    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

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

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

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

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

AppConfig

package com.example.componentlib2;

public class AppConfig {
    public static final String[] COMPONENTS = {
            "com.example.logincomponent.LoginApplication",
            "com.example.minecomponent.MineApplication"
    };
}

IAppComponent

package com.example.componentlib2;

import android.app.Application;

public interface IAppComponent {
    void initalliza(Application app);
}

package com.example.componentlib2;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

public interface ILoginService {

    // 跳转 从主 app  跳转到 login app
    void launch(Context context, String targetClass);

    //获取数据主app从login app 获取返回数据并显示
    Fragment newUserInfoFragment(FragmentManager fragmentManager, int viewId, Bundle bundle);

}

IMineService

package com.example.componentlib2;

import android.content.Context;

public interface IMineService {
    void launch(Context context,int userId);
}

ServiceFactory

package com.example.componentlib2;

public class ServiceFactory {
    private static final ServiceFactory instance = new ServiceFactory();

    public static ServiceFactory getInstance() {
        return instance;
    }

    private ServiceFactory() {

    }

    private ILoginService mLoginService;
    private IMineService mMineService;


    public ILoginService getLoginService() {
        return mLoginService;
    }

    public void setLoginService(ILoginService mLoginService) {
        this.mLoginService = mLoginService;
    }

    public IMineService getMineService() {
        return mMineService;
    }

    public void setMineService(IMineService mMineService) {
        this.mMineService = mMineService;
    }
}

logincomponent 组件

在这里插入图片描述

LoginActivity

package com.example.logincomponent;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class LoginActivity extends AppCompatActivity {

    public static String EXTRA_TARGET_CLASS = "extra_target_class";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_main);
    }
}

LoginApplication

package com.example.logincomponent;

import android.app.Application;

import com.example.componentlib2.IAppComponent;
import com.example.componentlib2.ServiceFactory;

public class LoginApplication extends Application implements IAppComponent {

    private static Application application;

    public static Application getApplication() {
        return application;
    }

    // 当 login 是 application 的时候 调用 initalliza 方法时,上下文指向的就是 LoginApplication
    @Override
    public void onCreate() {
        super.onCreate();
        initalliza(this);
    }

    //当 login是 lib 的时候 被主 App 调用被赋值
    @Override
    public void initalliza(Application app) {
        application = app;
        ServiceFactory.getInstance().setLoginService(new LoginService());
    }
}

LoginService

package com.example.logincomponent;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

import com.example.componentlib2.ILoginService;

public class LoginService implements ILoginService {

    @Override
    public void launch(Context context, String targetClass) {
        Intent intent = new Intent(context, LoginActivity.class);
        intent.putExtra(LoginActivity.EXTRA_TARGET_CLASS, targetClass);
        context.startActivity(intent);
    }

    @Override
    public Fragment newUserInfoFragment(FragmentManager fragmentManager, int viewId, Bundle bundle) {
        UserInfoFragment fragment = new UserInfoFragment();
        fragment.setArguments(bundle);
        fragmentManager.beginTransaction().add(viewId, fragment).commit();
        return fragment;
    }
}

UserInfoFragment

package com.example.logincomponent;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class UserInfoFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.userinfo_fragment, null);
    }
}

minecomponent 组件

在这里插入图片描述

MineActivity

package com.example.minecomponent;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MineActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mineactivity_main);
    }
}

MineApplication

package com.example.minecomponent;

import android.app.Application;

import com.example.componentlib2.IAppComponent;
import com.example.componentlib2.ServiceFactory;

public class MineApplication extends Application implements IAppComponent {

    private static Application application;

    public static Application getApplication() {
        return application;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        initalliza(this);
    }

    @Override
    public void initalliza(Application app) {
        application = app;
        ServiceFactory.getInstance().setMineService(new MineService());
    }
}

MineService

package com.example.minecomponent;

import android.content.Context;
import android.content.Intent;

import com.example.componentlib2.IMineService;

public class MineService implements IMineService {
    @Override
    public void launch(Context context, int userId) {
        Intent intent = new Intent(context, MineActivity.class);
        intent.putExtra("ID", userId);
        context.startActivity(intent);
    }
}

源码地址:
https://github.com/yoyo0316/StudyDemo/commit/a3165ddbfa04284ca472e423c3242c47d50748ad

其他组件化 相关文章

https://www.jianshu.com/p/ba32488f9555
https://blog.csdn.net/jj583500596/article/details/81362695

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值