arouter,calces的使用

晁聪
2023-12-01

简介

1.什么是路由?

说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能。

2.为什么需要路由?

在一些复杂的业务场景下(比如电商),灵活性比较强,很多功能都是运营人员动态配置的,比如下发一个活动页面,我们事先并不知道具体的目标页面,但如果事先做了约定,提前做好页面映射,便可以自由配置。
随着业务量的增长,客户端必然随之膨胀,开发人员的工作量越来越大,比如64K问题
协作开发问题。App一般都会走向组件化、插件化的道路,而组件化、插件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系。
简化代码。数行跳转代码精简成一行代码

3.Arouter简介?

ARouter是阿里巴巴开源的Android平台中对页面、服务提供路由功能的中间件,提倡的是简单且够用。
GitHub:https://github.com/alibaba/ARouter

4.Arouter优势?

支持直接解析标准URL进行跳转,并自动注入参数到目标页面中支持多模块工程使用
支持添加多个拦截器,自定义拦截顺序
支持依赖注入,可单独作为依赖注入框架使用
支持InstantRun
支持MultiDex(Google方案)映射关系按组分类、多级管理,按需初始化
支持用户指定全局降级与局部降级策略
页面、拦截器、服务等组件均自动注册到框架
支持多种方式配置转场动画
支持获取Fragment
支持Kotlin以及混编

5.Calces框架简介

Android构建工具包,这个工具的主旨是使用脚本自动处理机械化的重复劳动,让开发者专注更有价值的工作。 目前提供自动组件化控制与屏幕适配插件。
组件化构建Gradle插件
插件包的名字叫: component,其中提供了两个组件化辅助插件,分别叫calces.appconfig和calces.modules。 主要的功能是: 提供Gradle配置App依赖的组件、配置组件是否能单独运行、实现多个依赖不同模块的App同时构建等。
屏幕适配插件 组件包的名字叫: screen,其中提供了calces.screen插件
主要功能是: 根据设计稿与配置,自动生成smallestWidth适配文件,让你从此不需要再关注屏幕适配。

6.常用API

https://github.com/alibaba/ARouter/blob/master/README_CN.md
https://github.com/Tangpj/calces-gradle-plugin

使用

1.模块化

每个module都是一个library不能独立运行

2.组件化

每个module都是一个组件(application)可以独立运行->模块化测试;

3.模块化与组件化的区别

模块化不能独立运行组件化可以独立运行

4.Calces配置组件化

calces是Android构建工具包,这个工具的主旨是使用脚本自动处理机械化的重 复劳动,让开发者专注更有价值的工作。 目前提供自动组件化控制与屏幕适配 插件。
自动化构建module组合不同应用层序

5.Calces如何使用

官网地址:https://github.com/Tangpj/calces-gradle-plugin
Project 的 build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

plugins {
    id "calces.appconfig" version "1.0.11"
}

//calces组件化配置
appConfig{
    //debug测试模式->开发阶段为true->各个子模块单独运行测试
    debugEnable false
    //组件化架构中,第三层不同业务路基组件
    apps{
        app{
            modules ':news',':user'
        }
    }
    modules{
        //新闻资讯
        news {
            name ':news'
            mainActivity ".MainActivity"
            applicationId "com.example.news"
            isRunAlone false
            //是否可以单独运行
        }
        //用户
        user {
            name ':user'
            mainActivity ".MainActivity"
            applicationId "com.example.user"
            isRunAlone false
            //是否可以单独运行
        }
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

app Module

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.1"
    defaultConfig {
        applicationId "com.example.studio_skill3"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
    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'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4: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'
    implementation 'com.alibaba:arouter-api:1.5.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
    implementation project(path: ':news')
    implementation project(path: ':user')
}

news build.gradle

apply plugin: 'calces.modules'

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.1"


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

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }

    }

    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'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    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'
    implementation 'com.alibaba:arouter-api:1.5.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}

application

package com.example.studio_skill3;

import android.app.Application;

import com.alibaba.android.arouter.launcher.ARouter;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ARouter.openLog();
        ARouter.openDebug();
        ARouter.init(this);
    }
}

news-Activity


@Route(path = "/news/MainActivity",group = "news")
public class MainActivity extends AppCompatActivity {

    @Autowired
    String name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news);
        ARouter.getInstance().inject(this);
        Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
    }
}

app - Activity

package com.example.studio_skill3;

import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.alibaba.android.arouter.launcher.ARouter;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

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

    }

    //跳Module
    public void jump1(View view) {
        ARouter.getInstance().build("/news/MainActivity","news").withString("name","相依为命").navigation();
    }

    public void jump2(View view) {
        ARouter.getInstance().build("/user/MainActivity").navigation();
    }

    //跳Activity
    public void jump3(View view) {
        ARouter.getInstance().build("/app/Main2Activity","app").withString("message","独家记忆").navigation();
    }

    //跳fragment
    public void jump4(View view) {
        Fragment fragment = (Fragment) ARouter.getInstance().build("/app/MyFragment").withString("message","你好").navigation();
        getSupportFragmentManager().beginTransaction().add(R.id.liner_id,fragment).commit();
    }
}

Fragment

package com.example.studio_skill3;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;


/**
 * A simple {@link Fragment} subclass.
 */
@Route(path = "/app/MyFragment",group = "app")
public class MyFragment extends Fragment {

    @Autowired
    String message;

    public MyFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_my, container, false);
        ARouter.getInstance().inject(this);
        Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
        return view;
    }

}

 类似资料: