Repository: Xiasm/EasyRouter Branch: master Commit: 2b06de13e0a4 Files: 114 Total size: 137.0 KB Directory structure: gitextract_n0f08trr/ ├── .gitignore ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── xsm/ │ │ └── easyrouter/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── xsm/ │ │ │ └── easyrouter/ │ │ │ ├── BussinessInterceptor.java │ │ │ ├── Main2Activity.java │ │ │ ├── MainActivity.java │ │ │ ├── ShowActivity.java │ │ │ └── app/ │ │ │ └── MyApplication.java │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ ├── activity_main2.xml │ │ │ └── activity_show.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── xsm/ │ └── easyrouter/ │ └── ExampleUnitTest.java ├── base/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── xsm/ │ │ └── base/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── xsm/ │ │ │ └── base/ │ │ │ └── providers/ │ │ │ └── module1/ │ │ │ └── Module1Providers.java │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── xsm/ │ └── base/ │ └── ExampleUnitTest.java ├── build.gradle ├── config.gradle ├── easy-annotation/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── xsm/ │ └── easy/ │ └── annotation/ │ ├── Extra.java │ ├── Interceptor.java │ ├── Route.java │ └── modle/ │ └── RouteMeta.java ├── easy-compiler/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── xsm/ │ └── easy/ │ └── compiler/ │ ├── processor/ │ │ ├── ExtraProcessor.java │ │ ├── InterceptorProcessor.java │ │ └── RouterProcessor.java │ └── utils/ │ ├── Constant.java │ ├── LoadExtraBuilder.java │ ├── Log.java │ └── Utils.java ├── easy-core/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── xsm/ │ │ └── easy/ │ │ └── core/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── xsm/ │ │ │ └── easy/ │ │ │ └── core/ │ │ │ ├── EasyRouter.java │ │ │ ├── ExtraManager.java │ │ │ ├── Postcard.java │ │ │ ├── Warehouse.java │ │ │ ├── callback/ │ │ │ │ ├── InterceptorCallback.java │ │ │ │ └── NavigationCallback.java │ │ │ ├── exception/ │ │ │ │ └── NoRouteFoundException.java │ │ │ ├── implments/ │ │ │ │ └── InterceptorImpl.java │ │ │ ├── template/ │ │ │ │ ├── IExtra.java │ │ │ │ ├── IInterceptor.java │ │ │ │ ├── IInterceptorGroup.java │ │ │ │ ├── IRouteGroup.java │ │ │ │ ├── IRouteRoot.java │ │ │ │ └── IService.java │ │ │ ├── thread/ │ │ │ │ └── DefaultPoolExecutor.java │ │ │ └── utils/ │ │ │ ├── CancelableCountDownLatch.java │ │ │ ├── ClassUtils.java │ │ │ ├── UniqueKeyTreeMap.java │ │ │ └── Utils.java │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── xsm/ │ └── easy/ │ └── core/ │ └── ExampleUnitTest.java ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── module1/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── xsm/ │ │ └── module1/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── xsm/ │ │ │ └── module1/ │ │ │ ├── LoginInterceptor.java │ │ │ ├── Module1MainActivity.java │ │ │ └── Module1ProvidersImpl.java │ │ ├── module/ │ │ │ └── AndroidManifest.xml │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ └── activity_module1_main.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── xsm/ │ └── module1/ │ └── ExampleUnitTest.java ├── module2/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── xsm/ │ │ └── module2/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── xsm/ │ │ │ └── module2/ │ │ │ └── Module2MainActivity.java │ │ ├── module/ │ │ │ └── AndroidManifest.xml │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ └── activity_module2_main.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── xsm/ │ └── module2/ │ └── ExampleUnitTest.java └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Intellij IDEA .idea/ *.iml *.ipr *.iws out/ # Gradle build folder build/ .gradle/ # Android local.properties bin/ gen/ # JNI compile files *.o *.o.d # OS autogen folder information .DS_Store Thumbs.db # Temp files *.bak *.tmp *.temp *.swp *.*~ ~*.* # Eclipse project files .classpath .settings/ .project #Android 2.2 C/C++ compile .externalNativeBuild/ ================================================ FILE: README.md ================================================ ### 简介 路由在项目中用了很长一段时间了,一直用的ARouter,很早的时候,我就把ARouter里里外外研究了一番,可以说里面干货多多,但时间长了就有些记不住了,甚至一些技术点都记的混淆了。 于是便萌生了写一篇技术博客的想法,后来又觉着干巴巴的写一篇文章不足以让我认识的更深刻,就想着可否按照ARouter的思想自己实现一个简单的路由框架呢?
后来,在我不断地学习推动以及参考众多资料的情况下,耗费了几个月的业余时间,终于完成了这个项目。 ### 这个项目对你有什么帮助? 通常看来,我要理解ARouter,就要去读ARouter的源码,这当然是不错的方法,但需要花费很多的时间去理解源码,而这个项目能给你的好处是一步步有条理的指导你如何去设计路由框架、一些技术点的作用及为什么要用这些技术等等,并且重点放在讲解,直到最后设计出来一款自己的路由框架,所以说呢,干货多多,简要列举几点: * 首先,你可以学习到如何搭建组件化架构 * 其次,你可以学习到apt、javapoet等框架开发利器 * 再者,你可以手动实现自己的依赖注入框架 * 最后,像instantrun处理、框架设计等等 ### 项目理解推荐 既然你来了,我想我们的目的很明确,就是要从根本上理解路由。所以我推荐大家把demo clone下来在电脑上跑一遍,然后边浏览WIKI的文档边读代码,这样才能快速的理解设计的思想。
[文档指导,点击跳转wiki](https://github.com/Xiasm/EasyRouter/wiki)
##### 目录:
[一、从组件化引入路由设计需要满足的条件](https://github.com/Xiasm/EasyRouter/wiki/%E4%BB%8E%E7%BB%84%E4%BB%B6%E5%8C%96%E5%BC%95%E5%85%A5%E8%B7%AF%E7%94%B1%E8%AE%BE%E8%AE%A1%E9%9C%80%E8%A6%81%E6%BB%A1%E8%B6%B3%E7%9A%84%E6%9D%A1%E4%BB%B6) [二、通过Route注解去探究如何实现路由跳转](https://github.com/Xiasm/EasyRouter/wiki/%E9%80%9A%E8%BF%87Route%E6%B3%A8%E8%A7%A3%E5%8E%BB%E6%8E%A2%E7%A9%B6%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%B7%AF%E7%94%B1%E8%B7%B3%E8%BD%AC)
[三、利用apt和javapoet生成路由映射文件](https://github.com/Xiasm/EasyRouter/wiki/%E5%88%A9%E7%94%A8apt%E5%92%8Cjavapoet%E7%94%9F%E6%88%90%E8%B7%AF%E7%94%B1%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6)
[四、框架的设计](https://github.com/Xiasm/EasyRouter/wiki/%E6%A1%86%E6%9E%B6%E7%9A%84%E8%AE%BE%E8%AE%A1)
[五、框架的初始化](https://github.com/Xiasm/EasyRouter/wiki/%E6%A1%86%E6%9E%B6%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96)
[六、实现路由跳转](https://github.com/Xiasm/EasyRouter/wiki/%E5%AE%9E%E7%8E%B0%E8%B7%AF%E7%94%B1%E8%B7%B3%E8%BD%AC)
[七、为什么需要依赖注入](https://github.com/Xiasm/EasyRouter/wiki/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5) [八、Activity的属性注入](https://github.com/Xiasm/EasyRouter/wiki/Activity%E7%9A%84%E5%B1%9E%E6%80%A7%E6%B3%A8%E5%85%A5)
### 联系我 email:xiasem@163.com & devxiasm@gmail.com
微信:xsm0824mn003 ================================================ FILE: app/.gitignore ================================================ /build ================================================ FILE: app/build.gradle ================================================ apply plugin: 'com.android.application' def cfg = rootProject.ext.android def appId = rootProject.ext.appId android { compileSdkVersion 26 defaultConfig { applicationId appId["app"] minSdkVersion cfg.minSdkVersion targetSdkVersion cfg.targetSdkVersion versionCode cfg.versionCode versionName cfg.versionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { arguments = [moduleName: project.getName()] } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' annotationProcessor project(':easy-compiler') implementation project(':base') if (isModule) { implementation project(':module1') implementation project(':module2') } } ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ================================================ FILE: app/src/androidTest/java/com/xsm/easyrouter/ExampleInstrumentedTest.java ================================================ package com.xsm.easyrouter; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumented test, which will execute on an Android device. * * @see Testing documentation */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); assertEquals("com.xsm.easyrouter", appContext.getPackageName()); } } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/com/xsm/easyrouter/BussinessInterceptor.java ================================================ package com.xsm.easyrouter; import android.content.Context; import android.util.Log; import com.xsm.easy.annotation.Interceptor; import com.xsm.easy.core.Postcard; import com.xsm.easy.core.callback.InterceptorCallback; import com.xsm.easy.core.template.IInterceptor; /** * @author: luoxiaohui * @date: 2019-06-18 18:02 * @desc: */ @Interceptor(priority = 2, name = "test") public class BussinessInterceptor implements IInterceptor { private static final String TAG = "BussinessInterceptor"; /** * 拦截器流程 * * @param postcard * @param callback * @author luoxiaohui * @createTime 2019-05-23 20:53 */ @Override public void process(Postcard postcard, InterceptorCallback callback) { Log.e(TAG, "process()..."); callback.onNext(postcard); } /** * 在调用EasyRouter.init()初始化时,会调用到此方法 * * @param context * @author luoxiaohui * @createTime 2019-06-18 10:39 */ @Override public void init(Context context) { Log.e(TAG, "init()..."); } } ================================================ FILE: app/src/main/java/com/xsm/easyrouter/Main2Activity.java ================================================ package com.xsm.easyrouter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.xsm.easy.annotation.Route; @Route(path = "/main/main2") public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); } } ================================================ FILE: app/src/main/java/com/xsm/easyrouter/MainActivity.java ================================================ package com.xsm.easyrouter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import com.xsm.base.providers.module1.Module1Providers; import com.xsm.easy.annotation.Route; import com.xsm.easy.core.EasyRouter; import com.xsm.easy.core.Postcard; import com.xsm.easy.core.callback.NavigationCallback; @Route(path = "/main/main") public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private Module1Providers module1Providers; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initProviders(); } private void initProviders() { module1Providers = (Module1Providers) EasyRouter.getsInstance().build("/module1/providers").navigation(); } public void startModule1MainActivity(View view) { // EasyRouter.getsInstance().build("/module1/module1main").navigation(); EasyRouter.getsInstance().build("/module1/module1main") .withString("msg", "从MainActivity").navigation(); } public void startModule2MainActivity(View view) { EasyRouter.getsInstance().build("/module2/module2main").navigation(this, new NavigationCallback() { @Override public void onFound(Postcard postcard) { } @Override public void onLost(Postcard postcard) { } @Override public void onArrival(Postcard postcard) { } @Override public void onInterrupt(Throwable throwable) { Log.e(TAG, throwable.getMessage()); } }); } public void add(View view) { int num = module1Providers.add(5, 6); Toast.makeText(this, "5+6=" + num, Toast.LENGTH_SHORT).show(); } } ================================================ FILE: app/src/main/java/com/xsm/easyrouter/ShowActivity.java ================================================ package com.xsm.easyrouter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.xsm.easy.annotation.Route; @Route(path = "/show/info") public class ShowActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); } } ================================================ FILE: app/src/main/java/com/xsm/easyrouter/app/MyApplication.java ================================================ package com.xsm.easyrouter.app; import android.app.Application; import com.xsm.easy.core.EasyRouter; /** * Author: 夏胜明 * Date: 2018/7/30 0030 * Email: xiasem@163.com * Description: */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); EasyRouter.init(this); } } ================================================ FILE: app/src/main/res/drawable/ic_launcher_background.xml ================================================ ================================================ FILE: app/src/main/res/drawable-v24/ic_launcher_foreground.xml ================================================ ================================================ FILE: app/src/main/res/layout/activity_main.xml ================================================