diff --git a/.gitignore b/.gitignore index eef2d45..63fc54f 100644 --- a/.gitignore +++ b/.gitignore @@ -39,5 +39,6 @@ captures/ .idea/vcs.xml .idea/libraries + # Keystore files *.jks diff --git a/README.md b/README.md index 20d96c0..438a057 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,19 @@ Android项目组件化示例代码 **Android组件化方案**:http://blog.csdn.net/guiying712/article/details/55213884 + **Android组件化之终极方案**:http://blog.csdn.net/guiying712/article/details/78057120 1. 现在的 AndroidModulePattern 使用 阿里ARouter作为路由; + 2. Android组件化方案已经支持 **Fragment组件化**,使用方法请下载Demo查看; -3. 目前Android组件化方案还没有写完,后续会**继续更新**,完善组件化方案。 + +3. 本项目已适配Android Studio 3.0.1版本(Google仓库会带来一定影响) ## 集成开发模式和组件开发模式转换 -**1、首先打开Android项目的 gradle.properties 文件,然后将 isModule 改为你需要的开发模式, +**1、首先打开Android项目的 gradle.properties 文件,然后将 isModule 改为你需要的开发模式(true/false), 然后点击 "Sync Project" 按钮同步项目;** **2、![Image](/screenshots/develper.PNG) 在运行之前,请先按照图中选择一个能够运行的组件;** @@ -66,4 +69,4 @@ Android项目组件化示例代码 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/build.gradle b/build.gradle index 3874a63..40fe932 100644 --- a/build.gradle +++ b/build.gradle @@ -1,61 +1,38 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - repositories { - jcenter() - mavenCentral() - } - + apply from: 'versions.gradle' + addRepos(repositories) dependencies { - //classpath "com.android.tools.build:gradle:$localGradlePluginVersion" - //$localGradlePluginVersion是gradle.properties中的数据 - classpath "com.android.tools.build:gradle:$localGradlePluginVersion" + /* classpath deps.android_gradle_plugin*/ + classpath deps.android_gradle_plugin + classpath deps.kotlin.plugin + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files } } allprojects { - repositories { - jcenter() - mavenCentral() - //Add the JitPack repository - maven { url "https://jitpack.io" } - //支持arr包 - flatDir { - dirs 'libs' + addRepos(repositories) + // Android dependency 'com.android.support:design' has different version for the compile (25.3.1) and runtime (25.4.0) classpath. + // You should manually set the same version via DependencyResolution + subprojects { + project.configurations.all { + resolutionStrategy.eachDependency { details -> + if (details.requested.group == 'com.android.support' + && !details.requested.name.contains('multidex')) { + details.useVersion "27.0.2" + } + } } } + + // 组件缓存更新时间设置(默认每次build都更新) + configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'minutes' + } } task clean(type: Delete) { delete rootProject.buildDir -} - -// Define versions in a single place -//时间:2017.2.13;每次修改版本号都要添加修改时间 -ext { - // Sdk and tools - //localBuildToolsVersion是gradle.properties中的数据 - buildToolsVersion = localBuildToolsVersion - compileSdkVersion = 25 - minSdkVersion = 16 - targetSdkVersion = 25 - versionCode = 1 - versionName = "1.0" - javaVersion = JavaVersion.VERSION_1_8 - - // App dependencies version - supportLibraryVersion = "25.3.1" - retrofitVersion = "2.1.0" - glideVersion = "3.7.0" - loggerVersion = "1.15" - eventbusVersion = "3.0.0" - gsonVersion = "2.8.0" - photoViewVersion = "2.0.0" - - //检查时间:2017.6.6 - annotationProcessor = "1.0.3" - routerVersion = "1.2.1.1" - easyRecyclerVersion = "4.4.0" - cookieVersion = "v1.0.1" - toastyVersion = "1.1.3" -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index d817325..9b51cd5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,10 +18,8 @@ org.gradle.jvmargs=-Xmx2048m org.gradle.daemon=true org.gradle.configureondemand=true org.gradle.parallel=true -# ΪԶ(ΪÿĵԻһ) -localBuildToolsVersion=25.0.3 # ֵһAndroidStudio汾һ -localGradlePluginVersion=2.3.3 +localGradlePluginVersion=3.0.1 # ÿθġisModuleֵҪ "Sync Project" ť # isModuleǡɿģʽ͡ģʽл diff --git a/keystore.properties b/keystore.properties new file mode 100644 index 0000000..dabd93e --- /dev/null +++ b/keystore.properties @@ -0,0 +1,4 @@ +storePassword=guiying712 +keyPassword=guiying712 +keyAlias=guiying712 +storeFile=/mykey.jks \ No newline at end of file diff --git a/lib_common/build.gradle b/lib_common/build.gradle index 1ec98ca..87eb2af 100644 --- a/lib_common/build.gradle +++ b/lib_common/build.gradle @@ -1,37 +1,76 @@ apply plugin: 'com.android.library' android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - + compileSdkVersion build_versions.target_sdk defaultConfig { - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode - versionName rootProject.ext.versionName + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk + versionCode 1 + versionName "1.0" + } + + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + buildTypes { + release { + buildConfigField "boolean", "LOG_DEBUG", "true" + zipAlignEnabled false + shrinkResources false + minifyEnabled false + debuggable true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } } + } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - //Android Support - compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" - compile "com.android.support:design:$rootProject.supportLibraryVersion" - compile "com.android.support:percent:$rootProject.supportLibraryVersion" - //网络请求相关 - compile "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion" - compile "com.squareup.retrofit2:retrofit-mock:$rootProject.retrofitVersion" - compile "com.github.franmontiel:PersistentCookieJar:$rootProject.cookieVersion" - //稳定的 - compile "com.github.bumptech.glide:glide:$rootProject.glideVersion" - compile "com.orhanobut:logger:$rootProject.loggerVersion" - compile "org.greenrobot:eventbus:$rootProject.eventbusVersion" - compile "com.google.code.gson:gson:$rootProject.gsonVersion" - compile "com.github.chrisbanes:PhotoView:$rootProject.photoViewVersion" - - compile "com.jude:easyrecyclerview:$rootProject.easyRecyclerVersion" - compile "com.github.GrenderG:Toasty:$rootProject.toastyVersion" + api fileTree(include: ['*.jar'], dir: 'libs') + // Support libraries + api deps.support.app_compat + api deps.support.v4 + api deps.support.v13 + api deps.support.design + api deps.support.cardview + api deps.support.percent + api deps.support.recyclerview + api deps.constraint_layout + + // RxJava and retrofit + api deps.rx_android + api deps.rxjava2 + api deps.retrofit.runtime + api deps.retrofit.gson + api deps.persistent_cookie + + //Dagger + api deps.dagger.runtime + api deps.dagger.android + api deps.dagger.android_support + + // other + api deps.kotlin.stdlib + api deps.event_bus + api deps.gson + api deps.permission + api deps.utils + api deps.glide + + //view + api deps.photo_view + api deps.easy_recycler + api deps.material_dialog + api deps.logger + api deps.toasty //router - compile "com.alibaba:arouter-api:$rootProject.routerVersion" + api deps.arouter_api + + //annotationProcessor + annotationProcessor deps.dagger.android_support_compiler + annotationProcessor deps.dagger.compiler } diff --git a/lib_common/src/main/java/com/guiying/module/common/base/BaseActionBarActivity.java b/lib_common/src/main/java/com/guiying/module/common/base/BaseActionBarActivity.java index ffe9243..85c8570 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/BaseActionBarActivity.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/BaseActionBarActivity.java @@ -1,13 +1,7 @@ -/* - * @ProjectName: ISMS_Petrel_MCU - * @Copyright: 2017 HangZhou Hikvision System Technology Co., Ltd. All Right Reserved. - * @address: http://www.hikvision.com - * @Description: 本内容仅限于杭州海康威视系统技术公有限司内部使用,禁止转发. - */ - package com.guiying.module.common.base; import android.os.Bundle; +import android.support.annotation.Keep; import android.support.annotation.StringRes; import android.support.v7.app.ActionBar; @@ -22,6 +16,7 @@ * @version V1.2.0 * @name BaseActionBarActivity */ +@Keep public abstract class BaseActionBarActivity extends BaseActivity { /*默认的ActionBar*/ diff --git a/lib_common/src/main/java/com/guiying/module/common/base/BaseActivity.java b/lib_common/src/main/java/com/guiying/module/common/base/BaseActivity.java index 340afa2..32ffebe 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/BaseActivity.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/BaseActivity.java @@ -2,6 +2,7 @@ import android.os.Bundle; import android.support.annotation.IdRes; +import android.support.annotation.Keep; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -17,6 +18,7 @@ * @version V1.0.0 * @name BaseActivity */ +@Keep public abstract class BaseActivity extends AppCompatActivity { diff --git a/lib_common/src/main/java/com/guiying/module/common/base/BaseApplication.java b/lib_common/src/main/java/com/guiying/module/common/base/BaseApplication.java index b8d634a..5c183ee 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/BaseApplication.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/BaseApplication.java @@ -24,7 +24,7 @@ public class BaseApplication extends Application { private static BaseApplication sInstance; - private List mAppDelegateList; + private List mAppDelegateList; public static BaseApplication getIns() { @@ -37,16 +37,17 @@ public void onCreate() { sInstance = this; Logger.init("pattern").logLevel(LogLevel.FULL); Utils.init(this); - mAppDelegateList = ClassUtils.getObjectsWithInterface(this, ApplicationDelegate.class, ROOT_PACKAGE); - for (ApplicationDelegate delegate : mAppDelegateList) { + mAppDelegateList = ClassUtils.getObjectsWithInterface(this, IApplicationDelegate.class, ROOT_PACKAGE); + for (IApplicationDelegate delegate : mAppDelegateList) { delegate.onCreate(); } + } @Override public void onTerminate() { super.onTerminate(); - for (ApplicationDelegate delegate : mAppDelegateList) { + for (IApplicationDelegate delegate : mAppDelegateList) { delegate.onTerminate(); } } @@ -55,7 +56,7 @@ public void onTerminate() { @Override public void onLowMemory() { super.onLowMemory(); - for (ApplicationDelegate delegate : mAppDelegateList) { + for (IApplicationDelegate delegate : mAppDelegateList) { delegate.onLowMemory(); } } @@ -63,7 +64,7 @@ public void onLowMemory() { @Override public void onTrimMemory(int level) { super.onTrimMemory(level); - for (ApplicationDelegate delegate : mAppDelegateList) { + for (IApplicationDelegate delegate : mAppDelegateList) { delegate.onTrimMemory(level); } } diff --git a/lib_common/src/main/java/com/guiying/module/common/base/BaseFragment.java b/lib_common/src/main/java/com/guiying/module/common/base/BaseFragment.java index 116ab50..5ec3cb5 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/BaseFragment.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/BaseFragment.java @@ -2,10 +2,18 @@ import android.content.Context; import android.support.annotation.IdRes; +import android.support.annotation.Keep; import android.support.v4.app.Fragment; import com.guiying.module.common.utils.Utils; +/** + *

Fragment的基类

+ * + * @author 张华洋 + * @name BaseFragment + */ +@Keep public abstract class BaseFragment extends Fragment { protected BaseActivity mActivity; diff --git a/lib_common/src/main/java/com/guiying/module/common/base/BasePresenter.java b/lib_common/src/main/java/com/guiying/module/common/base/BasePresenter.java index d7468af..be56ad9 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/BasePresenter.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/BasePresenter.java @@ -1,5 +1,14 @@ package com.guiying.module.common.base; +import android.support.annotation.Keep; + +/** + *

Presenter的基类

+ * + * @author 张华洋 + * @name BasePresenter + */ +@Keep public interface BasePresenter { void start(); diff --git a/lib_common/src/main/java/com/guiying/module/common/base/BaseView.java b/lib_common/src/main/java/com/guiying/module/common/base/BaseView.java index 7d557ea..e1b0b21 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/BaseView.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/BaseView.java @@ -1,5 +1,15 @@ package com.guiying.module.common.base; + +import android.support.annotation.Keep; + +/** + *

View接口的基类

+ * + * @author 张华洋 + * @name BaseView + */ +@Keep public interface BaseView { void setPresenter(T presenter); diff --git a/lib_common/src/main/java/com/guiying/module/common/base/ClassUtils.java b/lib_common/src/main/java/com/guiying/module/common/base/ClassUtils.java index d767f26..7e65de6 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/ClassUtils.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/ClassUtils.java @@ -5,6 +5,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; +import android.support.annotation.Keep; import android.util.Log; import com.guiying.module.common.utils.Utils; @@ -25,6 +26,7 @@ * Copy from galaxy sdk ${com.alibaba.android.galaxy.utils.ClassUtils} * Scanner, find out class with any conditions, copy from google source code. */ +@Keep public class ClassUtils { private static final String TAG = "ClassUtils"; @@ -53,7 +55,8 @@ private static SharedPreferences getMultiDexPreferences(Context context) { * @param U know * @return 对象列表 */ - public static List getObjectsWithInterface(Context context, Class clazz, String path) { + public static List + getObjectsWithInterface(Context context, Class clazz, String path) { List objectList = new ArrayList<>(); try { //找出所有路径中的类名,主要用于各个组件根包名一致的情况 @@ -273,7 +276,7 @@ private static boolean isVMMultidexCapable() { } - Log.i("galaxy", "VM with name " + vmName + (isMultidexCapable ? " has multidex support" : " does not have multidex support")); + Log.i(TAG, "VM with name " + vmName + (isMultidexCapable ? " has multidex support" : " does not have multidex support")); return isMultidexCapable; } diff --git a/lib_common/src/main/java/com/guiying/module/common/base/ApplicationDelegate.java b/lib_common/src/main/java/com/guiying/module/common/base/IApplicationDelegate.java similarity index 75% rename from lib_common/src/main/java/com/guiying/module/common/base/ApplicationDelegate.java rename to lib_common/src/main/java/com/guiying/module/common/base/IApplicationDelegate.java index 1e98f86..1ea31b6 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/ApplicationDelegate.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/IApplicationDelegate.java @@ -1,5 +1,7 @@ package com.guiying.module.common.base; +import android.support.annotation.Keep; + /** *

类说明

* @@ -7,9 +9,8 @@ * @version V2.8.3 * @name ApplicationDelegate */ - - -public interface ApplicationDelegate { +@Keep +public interface IApplicationDelegate { void onCreate(); diff --git a/lib_common/src/main/java/com/guiying/module/common/base/IViewDelegate.java b/lib_common/src/main/java/com/guiying/module/common/base/IViewDelegate.java new file mode 100644 index 0000000..3c35b8e --- /dev/null +++ b/lib_common/src/main/java/com/guiying/module/common/base/IViewDelegate.java @@ -0,0 +1,21 @@ +package com.guiying.module.common.base; + + +import android.support.annotation.Keep; +import android.view.View; + +/** + *

类说明

+ * + * @author 张华洋 2018/1/4 22:10 + * @version V2.8.3 + * @name IFragmentDelegate + */ +@Keep +public interface IViewDelegate { + + BaseFragment getFragment(String name); + + View getView(String name); + +} diff --git a/lib_common/src/main/java/com/guiying/module/common/base/InfoCallback.java b/lib_common/src/main/java/com/guiying/module/common/base/InfoCallback.java index 96e6d21..8a5cf9b 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/InfoCallback.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/InfoCallback.java @@ -1,5 +1,7 @@ package com.guiying.module.common.base; +import android.support.annotation.Keep; + /** *

数据回调接口

* @@ -7,6 +9,7 @@ * @version V1.2.0 * @name InfoCallback */ +@Keep public interface InfoCallback { void onSuccess(T info); diff --git a/lib_common/src/main/java/com/guiying/module/common/base/ViewManager.java b/lib_common/src/main/java/com/guiying/module/common/base/ViewManager.java index 1b421f2..8f221a0 100644 --- a/lib_common/src/main/java/com/guiying/module/common/base/ViewManager.java +++ b/lib_common/src/main/java/com/guiying/module/common/base/ViewManager.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.content.Context; +import android.support.annotation.Keep; import android.util.Log; import java.util.ArrayList; @@ -15,6 +16,7 @@ * @version V1.1 * @name ViewManager */ +@Keep public class ViewManager { private static Stack activityStack; diff --git a/lib_common/src/main/java/com/guiying/module/common/utils/ScreenLockUtil.java b/lib_common/src/main/java/com/guiying/module/common/utils/ScreenLockUtil.java new file mode 100644 index 0000000..d85c106 --- /dev/null +++ b/lib_common/src/main/java/com/guiying/module/common/utils/ScreenLockUtil.java @@ -0,0 +1,84 @@ +package com.guiying.module.common.utils; + +import android.app.Activity; +import android.app.KeyguardManager; +import android.app.KeyguardManager.KeyguardLock; +import android.content.Context; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; +import android.util.Log; + +import java.util.HashMap; + +/** + * 用于保持屏幕高亮的工具 + */ +public class ScreenLockUtil { + private static final String TAG = "ScreenLockUtil"; + + private ScreenLockUtil() { + throw new UnsupportedOperationException("cannot be instantiated"); + } + + static private HashMap mWakeLockArray = new HashMap<>(); + static private HashMap mIsUnlockArray = new HashMap<>(); + + + /** + * 保持屏幕常亮 + * + * @param activity you know + */ + public static void keepScreenOn(Activity activity) { + WakeLock wakeLock = mWakeLockArray.get(activity); + if (wakeLock == null) { + PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); + wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, + activity.getClass().getName()); + } + + if (!wakeLock.isHeld()) { + wakeLock.acquire(); + } + + mWakeLockArray.put(activity, wakeLock); + + cancelLockScreen(activity); + + Log.i(TAG, "开启屏幕常亮"); + } + + + /** + * 取消屏幕常亮 + * + * @param activity you know + */ + public static void cancelKeepScreen(Activity activity) { + WakeLock wakeLock = mWakeLockArray.get(activity); + if (wakeLock != null) { + if (wakeLock.isHeld()) { + wakeLock.release(); + } + } + + Log.i(TAG, "取消屏幕常亮"); + } + + /** + * 取消锁屏限制 + * + * @param activity you know + */ + private static void cancelLockScreen(Activity activity) { + Boolean isUnlock = mIsUnlockArray.get(activity); + if (isUnlock != null && isUnlock) { + return; + } + KeyguardManager mKeyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); + KeyguardLock mKeyguardLock = mKeyguardManager.newKeyguardLock(activity.getClass().getName()); + mKeyguardLock.disableKeyguard(); + + mIsUnlockArray.put(activity, true); + } +} diff --git a/module_app/build.gradle b/module_app/build.gradle index 1e084f4..2776c5c 100644 --- a/module_app/build.gradle +++ b/module_app/build.gradle @@ -1,5 +1,13 @@ apply plugin: 'com.android.application' +// Create a variable called keystorePropertiesFile, and initialize it to your +// keystore.properties file, in the rootProject folder. +def keystorePropertiesFile = rootProject.file("keystore.properties") +// Initialize a new Properties() object called keystoreProperties. +def keystoreProperties = new Properties() +// Load your keystore.properties file into the keystoreProperties object. +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + static def buildTime() { return new Date().format("yyyyMMdd"); } @@ -7,26 +15,31 @@ static def buildTime() { android { signingConfigs { release { - keyAlias 'guiying712' - keyPassword 'guiying712' - storeFile file('/mykey.jks') - storePassword 'guiying712' + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] } } - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion build_versions.target_sdk defaultConfig { applicationId "com.guiying.module" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode - versionName rootProject.ext.versionName + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk + versionCode 1 + versionName "1.0" multiDexEnabled true //打包时间 resValue "string", "build_time", buildTime() } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildTypes { release { //更改AndroidManifest.xml中预先定义好占位符信息 @@ -60,13 +73,12 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:multidex:1.0.1' - if (isModule.toBoolean()) { - compile project(':lib_common') - } else { - compile project(':module_main') - compile project(':module_girls') - compile project(':module_news') + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation deps.support.multidex + implementation project(':lib_common') + if (!isModule.toBoolean()) { + implementation project(':module_main') + implementation project(':module_girls') + implementation project(':module_news') } } diff --git a/module_girls/build.gradle b/module_girls/build.gradle index 4014b71..a1838bd 100644 --- a/module_girls/build.gradle +++ b/module_girls/build.gradle @@ -5,23 +5,25 @@ if (isModule.toBoolean()) { } android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - + compileSdkVersion build_versions.target_sdk defaultConfig { - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode - versionName rootProject.ext.versionName + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk + versionCode 1 + versionName "1.0" - //ARouter javaCompileOptions { annotationProcessorOptions { - arguments = [moduleName: project.getName()] + arguments = [ moduleName : project.getName() ] } } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + sourceSets { main { if (isModule.toBoolean()) { @@ -36,10 +38,16 @@ android { } } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - annotationProcessor "com.alibaba:arouter-compiler:$rootProject.annotationProcessor" - compile project(':lib_common') + implementation fileTree(dir: 'libs', include: ['*.jar']) + annotationProcessor deps.arouter_compiler + implementation project(':lib_common') } diff --git a/module_girls/src/main/java/com/guiying/module/girls/GirlsFragment.java b/module_girls/src/main/java/com/guiying/module/girls/GirlsFragment.java index 4be5443..43accad 100644 --- a/module_girls/src/main/java/com/guiying/module/girls/GirlsFragment.java +++ b/module_girls/src/main/java/com/guiying/module/girls/GirlsFragment.java @@ -15,6 +15,16 @@ */ public class GirlsFragment extends BaseFragment { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @return A new instance of fragment GirlsFragment. + */ + public static GirlsFragment newInstance() { + return new GirlsFragment(); + } + public GirlsFragment() { // Required empty public constructor diff --git a/module_girls/src/main/java/com/guiying/module/girls/MyDelegate.java b/module_girls/src/main/java/com/guiying/module/girls/MyDelegate.java index 5ab446c..dc0ecf4 100644 --- a/module_girls/src/main/java/com/guiying/module/girls/MyDelegate.java +++ b/module_girls/src/main/java/com/guiying/module/girls/MyDelegate.java @@ -1,6 +1,8 @@ package com.guiying.module.girls; -import com.guiying.module.common.base.ApplicationDelegate; +import android.support.annotation.Keep; + +import com.guiying.module.common.base.IApplicationDelegate; import com.guiying.module.common.base.ViewManager; /** @@ -10,11 +12,13 @@ * @version V2.8.3 * @name MyDelegate */ -public class MyDelegate implements ApplicationDelegate { +@Keep +public class MyDelegate implements IApplicationDelegate { @Override public void onCreate() { - ViewManager.getInstance().addFragment(0, new GirlsFragment()); + //主动添加 + ViewManager.getInstance().addFragment(0, GirlsFragment.newInstance()); } @Override diff --git a/module_girls/src/main/java/com/guiying/module/girls/MyViewDelegate.java b/module_girls/src/main/java/com/guiying/module/girls/MyViewDelegate.java new file mode 100644 index 0000000..3d4294e --- /dev/null +++ b/module_girls/src/main/java/com/guiying/module/girls/MyViewDelegate.java @@ -0,0 +1,28 @@ +package com.guiying.module.girls; + +import android.support.annotation.Keep; +import android.view.View; + +import com.guiying.module.common.base.BaseFragment; +import com.guiying.module.common.base.IViewDelegate; + +/** + *

类说明

+ * + * @author 张华洋 2018/1/4 22:16 + * @version V2.8.3 + * @name MyViewDelegate + */ +@Keep +public class MyViewDelegate implements IViewDelegate { + + @Override + public BaseFragment getFragment(String name) { + return GirlsFragment.newInstance(); + } + + @Override + public View getView(String name) { + return null; + } +} diff --git a/module_main/build.gradle b/module_main/build.gradle index bba5baa..a1838bd 100644 --- a/module_main/build.gradle +++ b/module_main/build.gradle @@ -5,24 +5,24 @@ if (isModule.toBoolean()) { } android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - + compileSdkVersion build_versions.target_sdk defaultConfig { - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode - versionName rootProject.ext.versionName + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk + versionCode 1 + versionName "1.0" - //ARouter javaCompileOptions { annotationProcessorOptions { - arguments = [moduleName: project.getName()] + arguments = [ moduleName : project.getName() ] } } - vectorDrawables.useSupportLibrary = true } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } sourceSets { main { @@ -38,13 +38,16 @@ android { } } - + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - annotationProcessor "com.alibaba:arouter-compiler:$rootProject.annotationProcessor" - compile project(':lib_common') - compile 'com.android.support:design:25.3.1' - compile 'com.android.support:support-vector-drawable:25.3.1' + implementation fileTree(dir: 'libs', include: ['*.jar']) + annotationProcessor deps.arouter_compiler + implementation project(':lib_common') } diff --git a/module_main/src/main/java/com/guiying/module/main/BottomNavigationActivity.java b/module_main/src/main/java/com/guiying/module/main/BottomNavigationActivity.java index 9af5f0c..51c27cf 100644 --- a/module_main/src/main/java/com/guiying/module/main/BottomNavigationActivity.java +++ b/module_main/src/main/java/com/guiying/module/main/BottomNavigationActivity.java @@ -8,6 +8,8 @@ import com.guiying.module.common.base.BaseActivity; import com.guiying.module.common.base.BaseFragment; +import com.guiying.module.common.base.ClassUtils; +import com.guiying.module.common.base.IViewDelegate; import com.guiying.module.common.base.ViewManager; import com.guiying.module.common.widget.NoScrollViewPager; @@ -39,7 +41,7 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { mPager.setCurrentItem(1); return true; } else if (i == R.id.navigation_notifications) { - mPager.setCurrentItem(0); + mPager.setCurrentItem(2); return true; } return false; @@ -57,7 +59,9 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } private void initViewPager() { - mFragments = ViewManager.getInstance().getAllFragment(); + mFragments = ViewManager.getInstance().getAllFragment();//这几个Fragment是主动添加到ViewManager中的 + BaseFragment newsFragment = getNewsFragment();//主动寻找 + mFragments.add(newsFragment); mPager = (NoScrollViewPager) findViewById(R.id.container_pager); mAdapter = new FragmentAdapter(getSupportFragmentManager(), mFragments); mPager.setPagerEnabled(false); @@ -65,4 +69,18 @@ private void initViewPager() { } + /** + * 在News模块中寻找实现的Fragment + * + * @return Fragment + */ + private BaseFragment getNewsFragment() { + BaseFragment newsFragment = null; + List viewDelegates = ClassUtils.getObjectsWithInterface(this, IViewDelegate.class, "com.guiying.module.news"); + if (viewDelegates != null && !viewDelegates.isEmpty()) { + newsFragment = viewDelegates.get(0).getFragment(""); + } + return newsFragment; + } + } diff --git a/module_main/src/main/module/AndroidManifest.xml b/module_main/src/main/module/AndroidManifest.xml index a5eb0d9..0443b12 100644 --- a/module_main/src/main/module/AndroidManifest.xml +++ b/module_main/src/main/module/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.guiying.module.main"> - + @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/module_news/build.gradle b/module_news/build.gradle index 7c5b438..a1838bd 100644 --- a/module_news/build.gradle +++ b/module_news/build.gradle @@ -5,23 +5,25 @@ if (isModule.toBoolean()) { } android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - + compileSdkVersion build_versions.target_sdk defaultConfig { - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode - versionName rootProject.ext.versionName + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk + versionCode 1 + versionName "1.0" - //ARouter javaCompileOptions { annotationProcessorOptions { - arguments = [moduleName: project.getName()] + arguments = [ moduleName : project.getName() ] } } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + sourceSets { main { if (isModule.toBoolean()) { @@ -36,11 +38,16 @@ android { } } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - annotationProcessor "com.alibaba:arouter-compiler:$rootProject.annotationProcessor" - compile project(':lib_common') - compile 'com.android.support:support-v4:25.3.1' + implementation fileTree(dir: 'libs', include: ['*.jar']) + annotationProcessor deps.arouter_compiler + implementation project(':lib_common') } diff --git a/module_news/src/main/java/com/guiying/module/news/MyDelegate.java b/module_news/src/main/java/com/guiying/module/news/MyDelegate.java index 30bbfac..98f55a8 100644 --- a/module_news/src/main/java/com/guiying/module/news/MyDelegate.java +++ b/module_news/src/main/java/com/guiying/module/news/MyDelegate.java @@ -1,7 +1,10 @@ package com.guiying.module.news; -import com.guiying.module.common.base.ApplicationDelegate; +import android.support.annotation.Keep; + +import com.guiying.module.common.base.IApplicationDelegate; import com.guiying.module.common.base.ViewManager; +import com.orhanobut.logger.Logger; /** *

类说明

@@ -10,13 +13,14 @@ * @version V2.8.3 * @name MyDelegate */ - - -public class MyDelegate implements ApplicationDelegate { +@Keep +public class MyDelegate implements IApplicationDelegate { @Override public void onCreate() { - ViewManager.getInstance().addFragment(0, new NewsFragment()); + Logger.init("pattern"); + //主动添加 + ViewManager.getInstance().addFragment(0, NewsFragment.newInstance()); } @Override diff --git a/module_news/src/main/java/com/guiying/module/news/MyViewDelegate.java b/module_news/src/main/java/com/guiying/module/news/MyViewDelegate.java new file mode 100644 index 0000000..0620bb5 --- /dev/null +++ b/module_news/src/main/java/com/guiying/module/news/MyViewDelegate.java @@ -0,0 +1,28 @@ +package com.guiying.module.news; + +import android.support.annotation.Keep; +import android.view.View; + +import com.guiying.module.common.base.BaseFragment; +import com.guiying.module.common.base.IViewDelegate; + +/** + *

类说明

+ * + * @author 张华洋 2018/1/4 22:16 + * @version V2.8.3 + * @name MyViewDelegate + */ +@Keep +public class MyViewDelegate implements IViewDelegate { + + @Override + public BaseFragment getFragment(String name) { + return NewsFragment.newInstance(); + } + + @Override + public View getView(String name) { + return null; + } +} diff --git a/module_news/src/main/java/com/guiying/module/news/NewsFragment.java b/module_news/src/main/java/com/guiying/module/news/NewsFragment.java index e316af6..93c039a 100644 --- a/module_news/src/main/java/com/guiying/module/news/NewsFragment.java +++ b/module_news/src/main/java/com/guiying/module/news/NewsFragment.java @@ -15,6 +15,17 @@ */ public class NewsFragment extends BaseFragment { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @return A new instance of fragment NewsFragment. + */ + public static NewsFragment newInstance() { + return new NewsFragment(); + } + + public NewsFragment() { // Required empty public constructor diff --git a/settings.gradle b/settings.gradle index a7e0b34..4e334dd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,6 @@ -include ':module_app', +include ':lib_common', + ':module_app', ':module_main', ':module_girls', - ':module_news', - ':lib_common' + ':module_news' + diff --git a/versions.gradle b/versions.gradle new file mode 100644 index 0000000..4a8a289 --- /dev/null +++ b/versions.gradle @@ -0,0 +1,121 @@ +/** + * Shared file between builds so that they can all use the same dependencies and + * maven repositories. + **/ +ext.deps = [:] + +def versions = [:] +versions.android_gradle_plugin = "3.0.1" +versions.kotlin = "1.1.51" +versions.support = "27.0.2" +versions.multidex = "1.0.2" +versions.constraint_layout = "1.0.2" +versions.dagger = "2.11" +versions.glide = "3.8.0" +versions.rxjava2 = "2.1.7" +versions.rx_android = "2.0.1" +versions.retrofit = "2.3.0" +versions.event_bus = "3.1.1" +versions.photo_view = "2.0.0" +versions.persistent_cookie = "v1.0.1" +versions.gson = "2.8.2" +versions.qmui = "1.0.4" +versions.flow_layout = "1.0.3" +versions.swipe_recycler = "1.1.3" +versions.easy_recycler = "4.4.2" +versions.permission = "1.1.2" +versions.utils = "1.10.0" +versions.top_snackbar = "1.1.1" +versions.litepal = "1.6.1" +versions.toasty = "1.1.3" +versions.logger = "1.15" +versions.material_dialog = "0.9.6.0" +//Arouter +versions.arouter_compiler = "1.1.4" +versions.arouter_api = "1.3.1" + + + +def deps = [:] + +def support = [:] +support.annotations = "com.android.support:support-annotations:$versions.support" +support.app_compat = "com.android.support:appcompat-v7:$versions.support" +support.v13 = "com.android.support:support-v13:$versions.support" +support.percent = "com.android.support:percent:$versions.support" +support.recyclerview = "com.android.support:recyclerview-v7:$versions.support" +support.cardview = "com.android.support:cardview-v7:$versions.support" +support.design = "com.android.support:design:$versions.support" +support.v4 = "com.android.support:support-v4:$versions.support" +support.core_utils = "com.android.support:support-core-utils:$versions.support" +support.multidex = "com.android.support:multidex:$versions.multidex" +deps.support = support + + +def retrofit = [:] +retrofit.runtime = "com.squareup.retrofit2:retrofit:$versions.retrofit" +retrofit.adapter = "com.squareup.retrofit2:adapter-rxjava2:$versions.retrofi" +retrofit.gson = "com.squareup.retrofit2:converter-gson:$versions.retrofit" +deps.retrofit = retrofit + + +def dagger = [:] +dagger.runtime = "com.google.dagger:dagger:$versions.dagger" +dagger.android = "com.google.dagger:dagger-android:$versions.dagger" +dagger.android_support = "com.google.dagger:dagger-android-support:$versions.dagger" +dagger.compiler = "com.google.dagger:dagger-compiler:$versions.dagger" +dagger.android_support_compiler = "com.google.dagger:dagger-android-processor:$versions.dagger" +deps.dagger = dagger + + +def kotlin = [:] +kotlin.stdlib = "org.jetbrains.kotlin:kotlin-stdlib-jre7:$versions.kotlin" +kotlin.test = "org.jetbrains.kotlin:kotlin-test-junit:$versions.kotlin" +kotlin.plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin" +deps.kotlin = kotlin + +//view +deps.constraint_layout = "com.android.support.constraint:constraint-layout:$versions.constraint_layout" +deps.qmui = "com.qmuiteam:qmui:$versions.qmui" +deps.flow_layout = "com.zhy:flowlayout-lib:$versions.flow_layout" +deps.swipe_recycler = "com.yanzhenjie:recyclerview-swipe:$versions.swipe_recycler" +deps.easy_recycler = "com.jude:easyrecyclerview:$versions.easy_recycler" +deps.photo_view = "com.github.chrisbanes:PhotoView:$versions.photo_view" +deps.material_dialog = "com.afollestad.material-dialogs:core:$versions.material_dialog" + +deps.android_gradle_plugin = "com.android.tools.build:gradle:$versions.android_gradle_plugin" +deps.rxjava2 = "io.reactivex.rxjava2:rxjava:$versions.rxjava2" +deps.rx_android = "io.reactivex.rxjava2:rxandroid:$versions.rx_android" +//other +deps.glide = "com.github.bumptech.glide:glide:$versions.glide" +deps.event_bus = "org.greenrobot:eventbus:$versions.event_bus" +deps.persistent_cookie = "com.github.franmontiel:PersistentCookieJar:$versions.persistent_cookie" +deps.gson = "com.google.code.gson:gson:$versions.gson" +deps.permission = "com.yanzhenjie:permission:$versions.permission" +deps.utils = "com.blankj:utilcode:$versions.utils" +deps.top_snackbar ="com.androidadvance:topsnackbar:$versions.top_snackbar" +deps.litepal = "org.litepal.android:core:$versions.litepal" +deps.toasty = "com.github.GrenderG:Toasty:$versions.toasty" +deps.logger = "com.orhanobut:logger:$versions.logger" +deps.arouter_api = "com.alibaba:arouter-api:$versions.arouter_api" +deps.arouter_compiler = "com.alibaba:arouter-compiler:$versions.arouter_compiler" + +ext.deps = deps + +def build_versions = [:] +build_versions.min_sdk = 16 +build_versions.target_sdk = 27 +build_versions.build_tools = "27.0.2" +ext.build_versions = build_versions + + +def addRepos(RepositoryHandler handler) { + handler.google() + handler.jcenter() + handler.mavenCentral() + //Add the JitPack repository + handler.maven { url "https://jitpack.io" } + handler.maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} +} + +ext.addRepos = this.&addRepos