├── .gitattributes ├── .gitignore ├── .idea ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── GradlePlugin.iml ├── README.md ├── Test.iml ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wangpos │ │ └── test │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── doc │ │ └── readme.doc │ ├── java │ │ ├── com │ │ │ └── wangpos │ │ │ │ └── test │ │ │ │ ├── MainActivity.java │ │ │ │ ├── OnResume.java │ │ │ │ ├── Presenter.java │ │ │ │ ├── Test.java │ │ │ │ ├── base │ │ │ │ └── BaseActivity.java │ │ │ │ ├── inter │ │ │ │ ├── InstallManager.java │ │ │ │ └── InstallManagerImpl.java │ │ │ │ └── work │ │ │ │ └── UploadWork.java │ │ └── config │ │ │ ├── BuildConfigDefault.java │ │ │ └── ServiceLoader.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── wangpos │ └── test │ └── ExampleUnitTest.java ├── build.gradle ├── com └── wangpos │ └── test │ └── Test.class ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties ├── mygradleplugin ├── .gitignore ├── build.gradle ├── mygradleplugin.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wangpos │ │ └── mygradleplugin │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── groovy │ │ └── com │ │ │ └── micky │ │ │ └── gradle │ │ │ ├── JarZipUtil.groovy │ │ │ ├── MyCustomPlugin.groovy │ │ │ ├── MyInject.groovy │ │ │ ├── MyInject2.groovy │ │ │ ├── MyPlugin.groovy │ │ │ ├── MyTransform.groovy │ │ │ └── Utils.groovy │ └── resources │ │ └── META-INF │ │ └── gradle-plugins │ │ ├── com.micky.myTransform.properties │ │ └── com.micky.mycustom.properties │ └── test │ └── java │ └── com │ └── wangpos │ └── mygradleplugin │ └── ExampleUnitTest.java ├── repo └── com │ └── micky │ └── mygradleplugin │ ├── 1.0.0 │ ├── mygradleplugin-1.0.0.jar │ ├── mygradleplugin-1.0.0.jar.md5 │ ├── mygradleplugin-1.0.0.jar.sha1 │ ├── mygradleplugin-1.0.0.pom │ ├── mygradleplugin-1.0.0.pom.md5 │ └── mygradleplugin-1.0.0.pom.sha1 │ ├── 1.0.1 │ ├── mygradleplugin-1.0.1.jar │ ├── mygradleplugin-1.0.1.jar.md5 │ ├── mygradleplugin-1.0.1.jar.sha1 │ ├── mygradleplugin-1.0.1.pom │ ├── mygradleplugin-1.0.1.pom.md5 │ └── mygradleplugin-1.0.1.pom.sha1 │ ├── maven-metadata.xml │ ├── maven-metadata.xml.md5 │ └── maven-metadata.xml.sha1 ├── settings.gradle └── source ├── 16ms_do.md ├── aar.md ├── android.gradle ├── android_apk_optimization.md ├── android_performance_optimization.md ├── android_studio.xml ├── applicationVariant.gradle ├── assemble.md ├── assembleWithParams.md ├── chinese.md ├── configManifest.gradle ├── createJavaCode.gradle ├── custom_view_optimization.md ├── day01.gradle ├── day02.md ├── day03.gradle ├── day04.gradle ├── day05.gradle ├── diffManifest.md ├── english.md ├── exeRank.md ├── gc1.jpeg ├── gc2.jpeg ├── genJavadoc.gradle ├── gradle_tranform.md ├── initConfig.gradle ├── initServiceLoader.gradle ├── lint-results-obmDebug.html ├── lintOption.gradle ├── makeJar.md ├── memory_optimization.md ├── metaprogramming.md ├── operate_file.md ├── optim_list.md ├── optimization.gradle ├── packageOption.gradle ├── plugin_develop.md ├── productflavor.gradle ├── project_library.md ├── properties.gradle ├── sdkVersionType.md ├── set_java_version.gradle ├── sourceSet.gradle ├── task.md ├── ui_optimization.md ├── version.gradle ├── why_android_16ms.md └── workmanager.md /.gitattributes: -------------------------------------------------------------------------------- 1 | linguist-language=Groovy 2 | *.css linguist-language=Groovy 3 | *.html linguist-language=Groovy 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /gradle.properties 5 | /.idea/workspace.xml 6 | /.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | /gradle 12 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /GradlePlugin.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Gradle插件开发介绍 2 | 3 | - [英文文档](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/english.md) 4 | 5 | #### Gradle基础详解: 6 | 7 | 这一次一定要系统掌握,你准备好了吗? 8 | 9 | 10 | - [初识Gradle 和 领域专用语言](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/day01.gradle) 11 | - [Gradle 版本配置](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/day02.md) 12 | - [Gradle 模块配置](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/day03.gradle) 13 | - [Gradle 插件分类](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/day04.gradle) 14 | - [Gradle Android插件包含的内容](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/android.gradle) 15 | - [CompileSdkVersion minSdkVersion targetSdkVersion buildToolsVersion区别](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/sdkVersionType.md) 16 | - [Gradle 统一配置你的版本号](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/version.gradle) 17 | - [Gradle 分渠道打包](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/productflavor.gradle) 18 | - [Gradle 配置你的AndroidManifest](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/configManifest.gradle) 19 | - [Gradle 指定你的源码路径、动态去除不需要打包的类·优](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/sourceSet.gradle) 20 | - [Gradle 项目依赖配置](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/project_library.md) 21 | - [Gradle lintOption·优](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/lintOption.gradle) 22 | - [lint报告](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/lint-results-obmDebug.html) 23 | - [Gradle 打包优化配置·优](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/optimization.gradle) 24 | - [Gradle gradle.properties 配置gradle版本和buildTools版本,和一些不便的版本](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/properties.gradle) 25 | - [Gradle 使用variantFilter修改生成apk路径、名字](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/applicationVariant.gradle) 26 | - [Gradle 指定java版本](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/set_java_version.gradle) 27 | - [Gradle packagingOptions解决重复包和文件](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/packageOption.gradle) 28 | - [AndroidStudio常见问题](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/android_studio.xml) 29 | - [Gradle 命令打包apk](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/assemble.md) 30 | - [Gradle 命令行传递参数](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/assembleWithParams.md) 31 | - [Gradle 编译器动态生成java·优](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/operate_file.md) 32 | - [Gradle 创建Task](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/task.md) 33 | - [Gradle 打包选择不同的AndroidManifest.xml](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/diffManifest.md) 34 | - [Gradle 执行顺序](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/exeRank.md) 35 | - Gradle 生成测试报告 36 | - [Gradle 生成接口文档](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/genJavadoc.gradle) 37 | - [AAR 生成](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/aar.md) 38 | - [jar 生成](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/makeJar.md) 39 | - [元编程](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/metaprogramming.md) 40 | - 查看所有tasks命令 *./gradlew tasks --all* 41 | 42 | 43 | #### Gradle高级插件开发 44 | - [插件开发详细步骤](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/plugin_develop.md) 45 | - [Gradle Transform监听文件编译结束](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/gradle_tranform.md) 46 | 47 | #### Android性能优化 48 | - [apk瘦身优化](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/android_apk_optimization.md) 49 | - [界面性能UI](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/ui_optimization.md) 50 | - [内存泄露](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/memory_optimization.md) 51 | - [WorkManager](https://github.com/UCodeUStory/GradlePlugin/blob/master/source/workmanager.md) 52 | 53 | 54 | ### 问题总结 55 | 56 | - 1.找不到依赖库,需要在repositories中添加jcenter() 57 | - 2.javassist找不到jar包,就是需要javassist引入jar包 58 | - 3.发现生成的apk没有变化,删除了build目录重新build,仍然无变化,点击Android Studio setting 清理缓存,重新启动 59 | - 4.项目app修改名字报错时提示找不到项目,一般根目录.idea就可以解决 60 | - 5.解决Error:All flavors must now belong to a named flavor dimension. 61 | 62 | flavorDimensions "versionCode" 63 | - 6.Android Studio clean 时产生 Error:Execution failed for task ':app:mockableAndroidJar' > java.lang.NullPointer 64 | 65 | 解决1. 这个问题由于更改主项目complieSdk版本导致的,只需要将所有子项目的版本更改相同即可; 66 | 67 | 解决2. 也可以通过在 68 | 69 | 3. Press “OK” and try to Rebuild Project again. 70 | 71 | 解决3.File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle -> Experimental 72 | 取消 Enable All test..勾选,但是mac版本没找到这个选项 73 | 74 | 解决4. 在根目录添加 75 | 76 | gradle.taskGraph.whenReady { 77 | tasks.each { task -> 78 | if (task.name.equals('mockableAndroidJar')) { 79 | task.enabled = false 80 | } 81 | } 82 | } 83 | - 7.当我们修改 compile 'com.android.support:appcompat-v7:25.0.0'版本时,会报很多value 84 | 主题找不到等错误 85 | 此时我们只需要修改compileSDK版本和这个V7后面版本一致即可 86 | - 8.2018/8/1遇到问题 修改项目的app为其他名字时总是报找不到app in root project 经过好多天查找最终发现了问题所在,原来是 87 | 1. Go to File -> Settings -> Build, Execution, Deployment -> Compiler 2. Add to “Command-line Options”: 这里面全部去掉就可以了 88 | 89 | 90 | #### 友情链接 91 | [fly803/BaseProject](https://github.com/fly803/BaseProject) 92 | -------------------------------------------------------------------------------- /Test.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply from:'../source/initConfig.gradle' 4 | apply from:'../source/initServiceLoader.gradle' 5 | apply from:'../source/android.gradle' 6 | 7 | 8 | buildscript { 9 | repositories { 10 | maven { 11 | url uri('../repo') 12 | } 13 | 14 | jcenter() 15 | } 16 | 17 | dependencies { 18 | classpath group: 'com.micky', 19 | name: 'mygradleplugin', 20 | version: '1.0.1' 21 | } 22 | } 23 | 24 | apply plugin: 'com.micky.mycustom' 25 | //./gradlew assembleRelease 打包 会生成多个渠道包,在插件修改字节码文件的时候回报错,所以只能单独打包带有修改字节码插件的项目 26 | //apply plugin: 'com.micky.myTransform' 27 | 28 | dependencies { 29 | compile fileTree(include: ['*.jar'], dir: 'libs') 30 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 31 | exclude group: 'com.android.support', module: 'support-annotations' 32 | }) 33 | compile 'com.android.support:appcompat-v7:25.0.0' 34 | testCompile 'junit:junit:4.12' 35 | implementation "android.arch.work:work-runtime:1.0.0-alpha01" 36 | 37 | } 38 | 39 | android { 40 | buildToolsVersion '26.0.2' 41 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/qiyue/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/wangpos/test/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.wangpos.test", appContext.getPackageName()); 25 | } 26 | 27 | @Test 28 | public void useAppDebugContext() throws Exception { 29 | // Context of the app under test. 30 | Context appContext = InstrumentationRegistry.getTargetContext(); 31 | 32 | assertEquals("com.wangpos.test.debug", appContext.getPackageName()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/doc/readme.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UCodeUStory/GradlePluginDevelop/37e83857ab407d955478032f7a802ed5c65ee4ab/app/src/main/doc/readme.doc -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test; 2 | 3 | import android.arch.lifecycle.Observer; 4 | import android.os.Build; 5 | import android.support.annotation.Nullable; 6 | import android.support.annotation.RequiresApi; 7 | import android.os.Bundle; 8 | import android.util.Log; 9 | import android.view.View; 10 | import android.widget.Button; 11 | 12 | import com.wangpos.test.base.BaseActivity; 13 | import com.wangpos.test.work.UploadWork; 14 | 15 | import java.util.concurrent.TimeUnit; 16 | 17 | import androidx.work.Constraints; 18 | import androidx.work.Data; 19 | import androidx.work.NetworkType; 20 | import androidx.work.OneTimeWorkRequest; 21 | import androidx.work.PeriodicWorkRequest; 22 | import androidx.work.State; 23 | import androidx.work.WorkManager; 24 | import androidx.work.WorkStatus; 25 | 26 | public class MainActivity extends BaseActivity implements View.OnClickListener { 27 | 28 | private Presenter presenter; 29 | 30 | private Button btnRequestNetWrok; 31 | private Button btnPeriod; 32 | 33 | @RequiresApi(api = Build.VERSION_CODES.M) 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_main); 38 | 39 | Log.i("info","onCreate start"); 40 | Log.i("info","onCreate end"); 41 | 42 | 43 | // /Users/qiyue/GitProject/GradlePlugin/app/build/intermediates/classes/debug 44 | 45 | presenter = new Presenter(); 46 | 47 | if (BuildConfig.isDebug){ 48 | toast(BuildConfig.FLAVOR+"debug版本"); 49 | } 50 | 51 | // WorkManager.getInstance().cancelWorkById(oneTimeWorkRequest.getId()); 52 | 53 | 54 | 55 | 56 | 57 | btnRequestNetWrok = (Button) findViewById(R.id.btn_request_network); 58 | btnRequestNetWrok.setOnClickListener(this); 59 | btnPeriod = (Button) findViewById(R.id.btn_Period_work); 60 | btnPeriod.setOnClickListener(this); 61 | 62 | } 63 | 64 | @Override 65 | protected void onResume() { 66 | super.onResume(); 67 | presenter.onResume(); 68 | } 69 | 70 | 71 | 72 | 73 | @Override 74 | public void onClick(View v) { 75 | switch (v.getId()){ 76 | case R.id.btn_request_network: 77 | exeWorkByNetWork(); 78 | break; 79 | case R.id.btn_Period_work: 80 | exePeriodWork(); 81 | break; 82 | } 83 | } 84 | 85 | /** 86 | * 模拟一个网络请求 87 | */ 88 | private void exePeriodWork() { 89 | //notice 创建约束条件 90 | Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED) 91 | .build(); 92 | //notice 输入数据 93 | Data inputData = new Data.Builder().putBoolean("isTest", true).build(); 94 | 95 | //notice 执行定时任务:设置工作的时间间隔 96 | PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(UploadWork 97 | .class, 10, TimeUnit.MINUTES).addTag(UploadWork.TAG) 98 | .setConstraints(constraints).setInputData(inputData).build(); 99 | 100 | 101 | 102 | WorkManager.getInstance().cancelWorkById(periodicWorkRequest.getId()); 103 | //notice 设置结果回调 104 | WorkManager.getInstance().getStatusById(periodicWorkRequest.getId()) 105 | .observe(this, new Observer() { 106 | @Override 107 | public void onChanged(@Nullable WorkStatus workStatus) { 108 | 109 | Log.i("result","state="+workStatus.getState()); 110 | if (workStatus != null && workStatus.getState() == State.SUCCEEDED) { 111 | //notice 取出回调数据 112 | String result = workStatus.getOutputData().getString("result", ""); 113 | Log.i("result","workStatus="+workStatus.getState()); 114 | toast(result); 115 | 116 | } 117 | } 118 | }); 119 | //notice 执行 120 | WorkManager.getInstance().enqueue(periodicWorkRequest); 121 | 122 | 123 | /** 124 | * 你也可以让多个任务按顺序执行: 125 | 126 | WorkManager.getInstance(this) 127 | .beginWith(Work.from(LocationWork.class)) 128 | .then(Work.from(LocationUploadWorker.class)) 129 | .enqueue(); 130 | 你还可以让多个任务同时执行: 131 | 132 | WorkManager.getInstance(this).enqueue(Work.from(LocationWork.class, 133 | LocationUploadWorker.class)); 134 | */ 135 | } 136 | 137 | 138 | /** 139 | * 模拟一个网络请求 140 | */ 141 | private void exeWorkByNetWork() { 142 | //notice 创建约束条件 143 | Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED) 144 | .build(); 145 | 146 | //notice 输入数据 147 | Data inputData = new Data.Builder().putBoolean("isTest", true).build(); 148 | 149 | //notice 构建请求类型,一次的请求 150 | OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder( 151 | UploadWork.class 152 | ).setConstraints(constraints).setInputData(inputData).build(); 153 | 154 | 155 | //notice 设置结果回调 156 | WorkManager.getInstance().getStatusById(oneTimeWorkRequest.getId()) 157 | .observe(this, new Observer() { 158 | @Override 159 | public void onChanged(@Nullable WorkStatus workStatus) { 160 | 161 | if (workStatus != null && workStatus.getState() == State.SUCCEEDED) { 162 | //notice 取出回调数据 163 | String result = workStatus.getOutputData().getString("result", ""); 164 | Log.i("result","workStatus="+workStatus.getState()); 165 | toast(result); 166 | 167 | } 168 | } 169 | }); 170 | //notice 执行 171 | WorkManager.getInstance().enqueue(oneTimeWorkRequest); 172 | 173 | 174 | /** 175 | * 你也可以让多个任务按顺序执行: 176 | 177 | WorkManager.getInstance(this) 178 | .beginWith(Work.from(LocationWork.class)) 179 | .then(Work.from(LocationUploadWorker.class)) 180 | .enqueue(); 181 | 你还可以让多个任务同时执行: 182 | 183 | WorkManager.getInstance(this).enqueue(Work.from(LocationWork.class, 184 | LocationUploadWorker.class)); 185 | */ 186 | } 187 | 188 | 189 | private void cancel(){ 190 | // WorkManager.getInstance().cancelWorkById(oneTimeWorkRequest.getId()); 191 | } 192 | 193 | 194 | } 195 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/OnResume.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | 9 | @Retention(RetentionPolicy.CLASS) 10 | @Target(ElementType.METHOD) 11 | public @interface OnResume { 12 | int value(); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/Presenter.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test; 2 | 3 | import android.util.Log; 4 | 5 | /** 6 | * Created by qiyue on 2017/11/6. 7 | */ 8 | 9 | public class Presenter { 10 | 11 | /** 12 | * 动态插入 13 | */ 14 | public void onResume(){ 15 | 16 | } 17 | 18 | @OnResume(1) 19 | public void test(){ 20 | Log.i("info","test is invoke"); 21 | } 22 | 23 | @OnResume(1) 24 | public void test2(){ 25 | Log.i("info","test2 is invoke"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/Test.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test; 2 | 3 | /** 4 | * Created by qiyue on 2017/10/19. 5 | */ 6 | 7 | public class Test { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test.base; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.widget.Toast; 5 | 6 | /** 7 | * Created by qiyue on 2018/6/7. 8 | */ 9 | 10 | public class BaseActivity extends AppCompatActivity { 11 | 12 | 13 | 14 | protected void toast(String msg){ 15 | Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show(); 16 | } 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/inter/InstallManager.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test.inter; 2 | 3 | /** 4 | * Created by qiyue on 2018/5/30. 5 | */ 6 | 7 | public interface InstallManager { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/inter/InstallManagerImpl.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test.inter; 2 | 3 | /** 4 | * Created by qiyue on 2018/5/30. 5 | */ 6 | 7 | public class InstallManagerImpl { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/wangpos/test/work/UploadWork.java: -------------------------------------------------------------------------------- 1 | package com.wangpos.test.work; 2 | 3 | import android.support.annotation.NonNull; 4 | import android.util.Log; 5 | 6 | import androidx.work.Data; 7 | import androidx.work.Worker; 8 | 9 | /** 10 | * Created by qiyue on 2018/6/6. 11 | */ 12 | 13 | public class UploadWork extends Worker { 14 | 15 | public static final String TAG = UploadWork.class.getSimpleName(); 16 | 17 | @NonNull 18 | @Override 19 | public WorkerResult doWork() { 20 | 21 | Log.i(TAG,"模拟上传中......"); 22 | 23 | boolean isTest = getInputData().getBoolean("isTest",false); 24 | 25 | // try { 26 | // Thread.sleep(10000); 27 | // } catch (InterruptedException e) { 28 | // e.printStackTrace(); 29 | // } 30 | 31 | 32 | Data resultData = new Data.Builder().putString("result","--^_^--"+isTest).build(); 33 | setOutputData(resultData); 34 | return WorkerResult.SUCCESS; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/config/BuildConfigDefault.java: -------------------------------------------------------------------------------- 1 | package config; 2 | 3 | /** 4 | * Created by qiyue on 2018/5/30. 5 | */ 6 | 7 | public class BuildConfigDefault { 8 | 9 | static final int isOpen = 4; 10 | 11 | static final String name = "configName"; 12 | 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/config/ServiceLoader.java: -------------------------------------------------------------------------------- 1 | package config; 2 | import com.wangpos.test.inter.*; 3 | 4 | 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | 10 | /** 11 | * Created by qiyue on 2018/5/30. 12 | */ 13 | 14 | public class ServiceLoader { 15 | 16 | Map configs = new HashMap<>(); 17 | 18 | 19 | public ServiceLoader(){ 20 | configs.put(InstallManager.class,InstallManagerImpl.class); 21 | configs.put(InstallManager.class,InstallManagerImpl.class); 22 | configs.put(InstallManager.class,InstallManagerImpl.class); 23 | configs.put(InstallManager.class,InstallManagerImpl.class); 24 | configs.put(InstallManager.class,InstallManagerImpl.class); 25 | 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 |