diff --git a/build.gradle b/build.gradle
index 3438c38..8473f5b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
+apply from: "config.gradle"
buildscript {
repositories {
jcenter()
@@ -14,6 +14,10 @@ buildscript {
}
allprojects {
+ configurations.all {
+ // don't cache changing modules at all
+ resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
+ }
repositories {
jcenter()
}
diff --git a/config.gradle b/config.gradle
new file mode 100644
index 0000000..fd691f9
--- /dev/null
+++ b/config.gradle
@@ -0,0 +1,100 @@
+/*全局配置信息及第三方依赖统一管理*/
+ext {
+
+ appModuleMusicDemo = project.hasProperty("appModuleMusicDemo") ? project.property("appModuleMusicDemo").equals("1").toString() : false
+ appModulePicDemo = project.hasProperty("appModulePicDemo") ? project.property("appModulePicDemo").equals("1").toString() : false
+ appModuleWebDemo = project.hasProperty("appModuleWebDemo") ? project.property("appModuleWebDemo").equals("1").toString() : false
+
+
+ android = [compileSdkVersion : 27,
+ buildToolsVersion : '27.0.3',
+ minSdkVersion : 17,
+ targetSdkVersion : 23,
+ versionCode : 1,
+ versionName : "1.0.0",
+ applicationId : "com.example.tome.framedemomo2",
+
+ androidSupportSdkVersion: "27.0.2"
+
+ ]
+
+ dependencies = ["appcompat_v7" : "com.android.support:appcompat-v7:${android["androidSupportSdkVersion"]}",
+ "constraint_layout" : 'com.android.support.constraint:constraint-layout:1.1.1',
+ "runner" : 'com.android.support.test:runner:1.0.1',
+ "espresso_core" : 'com.android.support.test.espresso:espresso-core:3.0.1',
+ "junit" : 'junit:junit:4.12',
+ "support_annotations" : 'com.android.support:support-annotations:24.0.0',
+ "design" : "com.android.support:design:${android["androidSupportSdkVersion"]}",
+ "support-v4" : "com.android.support:support-v4:${android["androidSupportSdkVersion"]}",
+ "cardview-v7" : "com.android.support:cardview-v7:${android["androidSupportSdkVersion"]}",
+ "recyclerview-v7" : "com.android.support:recyclerview-v7:${android["androidSupportSdkVersion"]}",
+
+ //方法数超过65535解决方法64K MultiDex分包方法
+ "multidex" : 'com.android.support:multidex:1.0.2',
+
+ //路由
+ "arouter_api" : 'com.alibaba:arouter-api:1.2.4',
+ "arouter_compiler" : 'com.alibaba:arouter-compiler:1.1.4',
+ "arouter_annotation" : 'com.alibaba:arouter-annotation:1.0.4',
+
+ //黄油刀
+ "butterknife_compiler" : 'com.jakewharton:butterknife-compiler:8.4.0',
+ "butterknife" : 'com.jakewharton:butterknife:8.4.0',
+
+ //网络
+ //retrofit2包含okhttp
+ //"okhttp3" : 'com.squareup.okhttp3:okhttp:3.9.0',
+ "retrofit2" : 'com.squareup.retrofit2:retrofit:2.3.0',
+ "converter-gson" : 'com.squareup.retrofit2:converter-gson:2.3.0',
+ "adapter-rxjava2" : 'com.squareup.retrofit2:adapter-rxjava2:2.3.0',
+ "rxjava2:rxandroid" : 'io.reactivex.rxjava2:rxandroid:2.0.1',
+ "rxjava2" : 'io.reactivex.rxjava2:rxjava:2.1.5',
+ //日志拦截器
+ "logging-interceptor" : 'com.squareup.okhttp3:logging-interceptor:3.4.1',
+ //暂时没用上
+ "rxbinding2" : 'com.jakewharton.rxbinding2:rxbinding:2.1.0',
+ //日志
+ "logger" : 'com.orhanobut:logger:2.1.1',
+ //图片
+ "glide" : 'com.github.bumptech.glide:glide:4.5.0',
+ "glide:okhttp3" : 'com.github.bumptech.glide:okhttp3-integration:4.5.0',
+ //图片选择器
+ "PictureSelector" : 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3',
+ //图片缩放
+ "photoview" : 'com.github.chrisbanes.photoview:library:1.2.4',
+ //时间,地址,条件选择器
+ "pickerView" : 'com.contrarywind:Android-PickerView:3.2.7',
+ //SmartRefreshLayout
+ "smartRefreshLayout" : 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1',
+ "SmartRefreshHeader" : 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.5.1',
+ //banner
+ "banner" : 'com.youth.banner:banner:1.4.10',
+ //eventbus
+ "eventbus" : 'org.greenrobot:eventbus:3.0.0',
+ //baseRecyclerViewAdapterHelper
+ "baseRecyclerViewAdapterHelper" : 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22',
+ //Bugly集成
+ "bugly" : 'com.tencent.bugly:crashreport_upgrade:latest.release',
+ //仿ios进度条
+ // "kprogresshud" : 'com.kaopiz:kprogresshud:1.1.0',
+ //6.0权限管理
+ "permissionsdispatcher" : 'com.github.hotchemi:permissionsdispatcher:3.0.1',
+ "permissionsdispatcher_processor": 'com.github.hotchemi:permissionsdispatcher-processor:3.0.1',
+ //dagger 暂时没用
+ "dagger" : 'com.google.dagger:dagger:2.0.2',
+ "dagger-compiler" : 'com.google.dagger:dagger-compiler:2.0.2',
+ "javax-annotation" : 'org.glassfish:javax.annotation:10.0-b28',
+ //greendao
+ "greendao" : 'org.greenrobot:greendao:3.2.2',
+ //Android屏幕适配
+ "autolayout" : 'com.zhy:autolayout:1.4.5',
+ //安卓调试神器-Stetho
+ "stetho" : 'com.facebook.stetho:stetho:1.5.0',
+ "stetho-okhttp3" : 'com.facebook.stetho:stetho-okhttp3:1.5.0',
+ // 仿ios弹出对话窗体
+ "alertview" : 'com.bigkoo:alertview:1.0.3',
+ //bugly sdk
+ "tencent-bugly" : 'com.tencent.bugly:crashreport_upgrade:latest.release',
+ //节操播放器
+ "jiecao" : 'fm.jiecao:jiecaovideoplayer:5.7',]
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index aac7c9b..928e0d5 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,3 +15,7 @@ org.gradle.jvmargs=-Xmx1536m
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
+// 某个模块是否 app 0否 1是
+appModulePicDemo = 1
+appModuleMusicDemo = 1
+appModuleWebDemo = 1
\ No newline at end of file
diff --git a/macore/src/main/java/com/spinytech/macore/MaApplication.java b/macore/src/main/java/com/spinytech/macore/MaApplication.java
index c6beb90..755eb55 100644
--- a/macore/src/main/java/com/spinytech/macore/MaApplication.java
+++ b/macore/src/main/java/com/spinytech/macore/MaApplication.java
@@ -32,12 +32,14 @@ public abstract class MaApplication extends Application {
@CallSuper
@Override
public void onCreate() {
+ // wait for debugger for muti process
+ // android.os.Debug.waitForDebugger();
super.onCreate();
sInstance = this;
Logger.d(TAG,"Application onCreate start: "+System.currentTimeMillis());
init();
startWideRouter();
- initializeLogic();
+ registerAllApplicationLogic();
dispatchLogic();
instantiateLogic();
@@ -65,9 +67,9 @@ protected void startWideRouter() {
}
}
- public abstract void initializeAllProcessRouter();
+ public abstract void registerAllProcessRouter();
- protected abstract void initializeLogic();
+ protected abstract void registerAllApplicationLogic();
public abstract boolean needMultipleProcess();
diff --git a/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java b/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java
index d2bcc3e..78d94f6 100644
--- a/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java
+++ b/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java
@@ -15,6 +15,6 @@ public void onCreate() {
protected void initRouter() {
WideRouter.getInstance(mApplication);
- mApplication.initializeAllProcessRouter();
+ mApplication.registerAllProcessRouter();
}
}
diff --git a/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java b/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java
index 9a7d24b..d318a04 100644
--- a/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java
+++ b/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java
@@ -49,7 +49,7 @@ public IBinder onBind(Intent intent) {
boolean hasRegistered = WideRouter.getInstance(MaApplication.getMaApplication()).checkLocalRouterHasRegistered(domain);
if (!hasRegistered) {
Logger.e(TAG, "Bind error: The local router of process " + domain + " is not bidirectional." +
- "\nPlease create a Service extend LocalRouterConnectService then register it in AndroidManifest.xml and the initializeAllProcessRouter method of MaApplication." +
+ "\nPlease create a Service extend LocalRouterConnectService then register it in AndroidManifest.xml and the registerAllProcessRouter method of MaApplication." +
"\nFor example:" +
"\n" +
"\nWideRouter.registerLocalRouter(\"your process name\",XXXConnectService.class);");
diff --git a/maindemo/build.gradle b/maindemo/build.gradle
index 550947b..29d2613 100644
--- a/maindemo/build.gradle
+++ b/maindemo/build.gradle
@@ -1,4 +1,6 @@
+
apply plugin: 'com.android.application'
+def channel = hasProperty("channel") ? property("channel") : "test"
android {
compileSdkVersion 24
@@ -10,18 +12,22 @@ android {
targetSdkVersion 24
versionCode 1
versionName "1.0"
-
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ // read gradle.properties
+ buildConfigField "boolean", "channel", project.hasProperty("channel") ? project.property("channel").equals("2").toString() : "false"
+
}
buildTypes {
release {
+ manifestPlaceholders = [
+ "channel": "\"$channel\""
+ ]
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
-
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
@@ -30,8 +36,16 @@ dependencies {
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile project(':macore')
- compile project(':musicdemo')
- compile project(':picdemo')
- compile project(':webdemo')
+
+
+ if (!Boolean.valueOf(rootProject.ext.appModulePicDemo)) {
+ compile project(':picdemo')
+ }
+ if (!Boolean.valueOf(rootProject.ext.appModuleMusicDemo)) {
+ compile project(':musicdemo')
+ }
+ if (!Boolean.valueOf(rootProject.ext.appModuleWebDemo)) {
+ compile project(':webdemo')
+ }
}
diff --git a/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java b/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java
index 01765cb..d5fbc6c 100644
--- a/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java
+++ b/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java
@@ -1,31 +1,59 @@
package com.spinytech.maindemo;
+import android.util.Pair;
+
import com.spinytech.macore.MaApplication;
+import com.spinytech.macore.multiprocess.BaseApplicationLogic;
+import com.spinytech.macore.router.LocalRouterConnectService;
import com.spinytech.macore.router.WideRouter;
-import com.spinytech.musicdemo.MusicApplicationLogic;
-import com.spinytech.musicdemo.MusicRouterConnectService;
-import com.spinytech.picdemo.PicApplicationLogic;
-import com.spinytech.picdemo.PicRouterConnectService;
-import com.spinytech.webdemo.WebApplicationLogic;
+
+import java.util.LinkedList;
/**
* Created by wanglei on 2016/11/29.
*/
public class MyApplication extends MaApplication {
+ public static LinkedList> applicationLogic;
+ public static LinkedList> allProcessRouter;
+
+ static {
+ applicationLogic = new LinkedList<>();
+ applicationLogic.add(new Pair("com.spinytech.maindemo", "com.spinytech.maindemo.MainApplicationLogic"));
+ applicationLogic.add(new Pair("com.spinytech.maindemo", "com.spinytech.webdemo.WebApplicationLogic"));
+ applicationLogic.add(new Pair("com.spinytech.maindemo:music", "com.spinytech.musicdemo.MusicApplicationLogic"));
+ applicationLogic.add(new Pair("com.spinytech.maindemo:pic", "com.spinytech.picdemo.PicApplicationLogic"));
+
+
+ allProcessRouter = new LinkedList<>();
+ allProcessRouter.add(new Pair("com.spinytech.maindemo", "com.spinytech.maindemo.MainRouterConnectService"));
+ allProcessRouter.add(new Pair("com.spinytech.maindemo:music", "com.spinytech.musicdemo.MusicRouterConnectService"));
+ allProcessRouter.add(new Pair("com.spinytech.maindemo:pic", "com.spinytech.picdemo.PicRouterConnectService"));
+
+ }
@Override
- public void initializeAllProcessRouter() {
- WideRouter.registerLocalRouter("com.spinytech.maindemo",MainRouterConnectService.class);
- WideRouter.registerLocalRouter("com.spinytech.maindemo:music",MusicRouterConnectService.class);
- WideRouter.registerLocalRouter("com.spinytech.maindemo:pic",PicRouterConnectService.class);
+ public void registerAllProcessRouter() {
+ for (Pair processRouter : allProcessRouter) {
+ try {
+ Class extends LocalRouterConnectService> localRouterClass = (Class extends LocalRouterConnectService>) Class.forName(processRouter.second);
+ WideRouter.registerLocalRouter(processRouter.first,localRouterClass);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
}
@Override
- protected void initializeLogic() {
- registerApplicationLogic("com.spinytech.maindemo",999, MainApplicationLogic.class);
- registerApplicationLogic("com.spinytech.maindemo",998, WebApplicationLogic.class);
- registerApplicationLogic("com.spinytech.maindemo:music",999, MusicApplicationLogic.class);
- registerApplicationLogic("com.spinytech.maindemo:pic",999, PicApplicationLogic.class);
+ protected void registerAllApplicationLogic() {
+ for (Pair processLogic : applicationLogic) {
+ try {
+ Class extends BaseApplicationLogic> applicationLogicClass = (Class extends BaseApplicationLogic>) Class.forName(processLogic.second);
+ registerApplicationLogic(processLogic.first, 998, applicationLogicClass);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
}
@Override
diff --git a/musicdemo/app/AndroidManifest.xml b/musicdemo/app/AndroidManifest.xml
new file mode 100644
index 0000000..2509c0b
--- /dev/null
+++ b/musicdemo/app/AndroidManifest.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java b/musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java
new file mode 100644
index 0000000..dd7838d
--- /dev/null
+++ b/musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java
@@ -0,0 +1,16 @@
+package com.spinytech.musicdemo;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class MusicDemoActivity extends Activity {
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.music_layout);
+ }
+
+
+}
diff --git a/musicdemo/app/res/layout/music_layout.xml b/musicdemo/app/res/layout/music_layout.xml
new file mode 100644
index 0000000..f9504c9
--- /dev/null
+++ b/musicdemo/app/res/layout/music_layout.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/musicdemo/build.gradle b/musicdemo/build.gradle
index 7e56760..8e051f8 100644
--- a/musicdemo/build.gradle
+++ b/musicdemo/build.gradle
@@ -1,4 +1,9 @@
-apply plugin: 'com.android.library'
+appModuleMusicDemo = rootProject.ext.appModuleMusicDemo
+if (Boolean.valueOf(appModuleMusicDemo)) {
+ apply plugin: 'com.android.application'
+} else {
+ apply plugin: 'com.android.library'
+}
android {
compileSdkVersion 24
@@ -9,6 +14,10 @@ android {
targetSdkVersion 24
versionCode 1
versionName "1.0"
+ multiDexEnabled true
+ ndk {
+ abiFilters "armeabi", "x86"
+ }
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -19,6 +28,26 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+ sourceSets{
+ main {
+ if (Boolean.valueOf(appModuleMusicDemo)) {
+ manifest.srcFile 'app/AndroidManifest.xml'
+ java.srcDirs = ['src/main/java','app/java']
+ resources.srcDirs = ['src/main/resources','app/resources']
+ aidl.srcDirs = ['src/main/aidl','app/aidl']
+ renderscript.srcDirs = ['src/main/rs','app/rs']
+ res.srcDirs = ['src/main/res','app/res']
+ assets.srcDirs = ['src/main/assets','app/assets']
+ jniLibs.srcDirs = ['src/main/jniLibs','app/jniLibs']
+ } else {
+ manifest.srcFile 'src/main/AndroidManifest.xml'
+ java {
+ //排除java/debug文件夹下的所有文件
+ exclude '*debug'
+ }
+ }
+ }
+ }
}
dependencies {
@@ -29,4 +58,5 @@ dependencies {
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile project(':macore')
+ annotationProcessor rootProject.ext.dependencies["butterknife_compiler"]
}
diff --git a/picdemo/build.gradle b/picdemo/build.gradle
index b2461be..c713780 100644
--- a/picdemo/build.gradle
+++ b/picdemo/build.gradle
@@ -1,4 +1,10 @@
-apply plugin: 'com.android.library'
+appModulePicDemo = rootProject.ext.appModuleWebDemo
+if (Boolean.valueOf(appModulePicDemo)) {
+ apply plugin: 'com.android.application'
+} else {
+ apply plugin: 'com.android.library'
+}
+
android {
compileSdkVersion 25
@@ -19,6 +25,27 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+
+ sourceSets{
+ main {
+ if (Boolean.valueOf(appModulePicDemo)) {
+ manifest.srcFile 'src/main/app/AndroidManifest.xml'
+ java.srcDirs = ['src/main/java','src/main/app/java']
+ resources.srcDirs = ['src/main/resources','src/main/app/resources']
+ aidl.srcDirs = ['src/main/aidl','src/main/app/aidl']
+ renderscript.srcDirs = ['src/main/rs','src/main/app/rs']
+ res.srcDirs = ['src/main/res','src/main/app/res']
+ assets.srcDirs = ['src/main/assets','src/main/app/assets']
+ jniLibs.srcDirs = ['src/main/jniLibs','src/main/app/jniLibs']
+ } else {
+ manifest.srcFile 'src/main/AndroidManifest.xml'
+ java {
+ //排除java/debug文件夹下的所有文件
+ exclude '*debug'
+ }
+ }
+ }
+ }
}
dependencies {
diff --git a/picdemo/src/main/app/AndroidManifest.xml b/picdemo/src/main/app/AndroidManifest.xml
new file mode 100644
index 0000000..efd8e3c
--- /dev/null
+++ b/picdemo/src/main/app/AndroidManifest.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java b/picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java
new file mode 100644
index 0000000..c288739
--- /dev/null
+++ b/picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java
@@ -0,0 +1,69 @@
+package com.spinytech.picdemo;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.AssetManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PicDemoActivity extends Activity {
+
+ private static List oomList = new ArrayList<>();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.activity_pic);
+ showPic();
+ }
+ private void showPic(){
+ Intent intent = getIntent();
+ if(intent!=null){
+ boolean isBig = intent.getBooleanExtra("is_big",false);
+ if(!isBig){
+ ((ImageView)findViewById(R.id.pic_iv)).setImageBitmap(getImageFromAssetsFile("messi.png"));
+ }
+ //Do something crazy.... like OOM
+ else{
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for(int i = 0;i<100;i++){
+ oomList.add(getImageFromAssetsFile("messi.png"));
+ }
+ }
+ }).start();
+ }
+ }
+ }
+
+ private Bitmap getImageFromAssetsFile(String fileName)
+ {
+ Bitmap image = null;
+ AssetManager am = getResources().getAssets();
+ try
+ {
+ InputStream is = am.open(fileName);
+ image = BitmapFactory.decodeStream(is);
+ is.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ return image;
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index bc63f52..4e6834f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,16 @@
-include ':macore', ':musicdemo', ':maindemo', ':picdemo', ':webdemo'
+// core
+include ':macore'
+
+// base-lib
+
+// module
+include ':musicdemo'
+
+// module
+include ':picdemo'
+
+// module
+include ':webdemo'
+
+// app
+include ':maindemo'
diff --git a/webdemo/build.gradle b/webdemo/build.gradle
index b2461be..84981a6 100644
--- a/webdemo/build.gradle
+++ b/webdemo/build.gradle
@@ -1,4 +1,9 @@
-apply plugin: 'com.android.library'
+appModuleWebDemo = rootProject.ext.appModuleWebDemo
+if (Boolean.valueOf(appModuleWebDemo)) {
+ apply plugin: 'com.android.application'
+} else {
+ apply plugin: 'com.android.library'
+}
android {
compileSdkVersion 25
@@ -19,6 +24,27 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+
+ sourceSets{
+ main {
+ if (Boolean.valueOf(appModuleWebDemo)) {
+ manifest.srcFile 'src/main/app/AndroidManifest.xml'
+ java.srcDirs = ['src/main/java','src/main/app/java']
+ resources.srcDirs = ['src/main/resources','src/main/app/resources']
+ aidl.srcDirs = ['src/main/aidl','src/main/app/aidl']
+ renderscript.srcDirs = ['src/main/rs','src/main/app/rs']
+ res.srcDirs = ['src/main/res','src/main/app/res']
+ assets.srcDirs = ['src/main/assets','src/main/app/assets']
+ jniLibs.srcDirs = ['src/main/jniLibs','src/main/app/jniLibs']
+ } else {
+ manifest.srcFile 'src/main/AndroidManifest.xml'
+ java {
+ //排除java/debug文件夹下的所有文件
+ exclude '*debug'
+ }
+ }
+ }
+ }
}
dependencies {
diff --git a/webdemo/src/main/app/AndroidManifest.xml b/webdemo/src/main/app/AndroidManifest.xml
new file mode 100644
index 0000000..8680036
--- /dev/null
+++ b/webdemo/src/main/app/AndroidManifest.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java b/webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java
new file mode 100644
index 0000000..80ec4bd
--- /dev/null
+++ b/webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java
@@ -0,0 +1,56 @@
+package com.spinytech.webdemo;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import com.spinytech.macore.MaApplication;
+import com.spinytech.macore.router.LocalRouter;
+import com.spinytech.macore.router.RouterRequest;
+
+public class WebDemoActivity extends Activity {
+
+ private WebView mContentWv;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_web);
+ mContentWv = (WebView) findViewById(R.id.web);
+ mContentWv.setWebViewClient(new MyWebViewClient());
+ mContentWv.getSettings().setBuiltInZoomControls(true);
+ mContentWv.getSettings().setJavaScriptEnabled(true);
+ mContentWv.getSettings().setSupportZoom(true);
+ mContentWv.getSettings().setUseWideViewPort(true);
+ mContentWv.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
+ mContentWv.getSettings().setLoadWithOverviewMode(true);
+ mContentWv.loadUrl("file:///android_asset/page.html");
+ }
+
+
+ public void dispatchAction(String url) {
+ if (url.indexOf("your_protocol://") >= 0) {
+ String command = url.substring("your_protocol://".length());
+ try {
+ LocalRouter.getInstance(MaApplication.getMaApplication()).route(this, new RouterRequest.Builder(this).url(command).build());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ class MyWebViewClient extends WebViewClient {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ if (!TextUtils.isEmpty(url) && url.startsWith("your_protocol://")) {
+ dispatchAction(url);
+ } else {
+ mContentWv.loadUrl(url);
+ }
+ return true;
+ }
+ }
+}
diff --git a/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java b/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java
index f351cfb..6312c31 100644
--- a/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java
+++ b/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java
@@ -32,8 +32,8 @@ protected void onCreate(Bundle savedInstanceState) {
public void dispatchAction(String url) {
- if (url.indexOf("your_protocol://") >= 0) {
- String command = url.substring("your_protocol://".length());
+ if (url.indexOf("yourprotocol://") >= 0) {
+ String command = url.substring("yourprotocol://".length());
try {
LocalRouter.getInstance(MaApplication.getMaApplication()).route(this, new RouterRequest.Builder(this).url(command).build());
} catch (Exception e) {
@@ -45,7 +45,7 @@ public void dispatchAction(String url) {
class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (!TextUtils.isEmpty(url) && url.startsWith("your_protocol://")) {
+ if (!TextUtils.isEmpty(url) && url.startsWith("yourprotocol://")) {
dispatchAction(url);
} else {
mContentWv.loadUrl(url);