├── .gitattributes ├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── lhj │ │ └── omnipotent │ │ └── smaple │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── lhj │ │ │ └── omnipotent │ │ │ └── smaple │ │ │ ├── FragmentA.java │ │ │ └── MainActivity.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ └── fragment.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── lhj │ └── omnipotent │ └── smaple │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── omnipotent ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── lhj │ │ └── omnipotent │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── lhj │ │ │ └── omnipotent │ │ │ ├── OmnipotentInterface.java │ │ │ ├── OmnipotentInterfaceHasParamHasResult.java │ │ │ ├── OmnipotentInterfaceHasParamNoResult.java │ │ │ ├── OmnipotentInterfaceNoParamHasResult.java │ │ │ ├── OmnipotentInterfaceNoParamNoResult.java │ │ │ └── OmnipotentManager.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── lhj │ └── omnipotent │ └── ExampleUnitTest.java ├── settings.gradle └── video ├── omnipotent.gif └── omnipotent.mp4 /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/assetWizardSettings.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | .idea/caches 44 | 45 | # Keystore files 46 | # Uncomment the following line if you do not want to check your keystore files in. 47 | #*.jks 48 | 49 | # External native build folder generated in Android Studio 2.2 and later 50 | .externalNativeBuild 51 | 52 | # Google Services (e.g. APIs or Firebase) 53 | google-services.json 54 | 55 | # Freeline 56 | freeline.py 57 | freeline/ 58 | freeline_project_description.json 59 | 60 | # fastlane 61 | fastlane/report.xml 62 | fastlane/Preview.html 63 | fastlane/screenshots 64 | fastlane/test_output 65 | fastlane/readme.md 66 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Omnipotent 2 | ![](https://upload-images.jianshu.io/upload_images/10018045-3a1d916e0af2d37b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 3 | 4 | # 1.前言 5 | - 开发中,类与类之间交互又以下几种方式: 6 | ![类之间交互方式.png](https://upload-images.jianshu.io/upload_images/10018045-2a8510cd05bf4314.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 7 | 8 | - 上述那么多种方式都具备各种缺点,是否有一种方式能解决上述的大部分缺点呢? 9 | - **Omnipotent 库**(万能接口库),它就是解决**样式重复代码、类之间交互耦合**而诞生,还具备**使用简单、链式调用**的特点。 10 | - 本文特点:**图片多,字体少** 11 | - 文章中实例 **[linhaojian的Github](https://github.com/linhaojian)** 12 | _______________________________________________________________________________ 13 | # 2.目录 14 | ![目录.png](https://upload-images.jianshu.io/upload_images/10018045-0dba7d4e7d612010.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 15 | _______________________________________________________________________________ 16 | # 3.简介 17 | ![介绍.png](https://upload-images.jianshu.io/upload_images/10018045-74e9c3e8f10001b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 18 | _______________________________________________________________________________ 19 | # 4.原理 20 | ## 4.1 举个例子 21 | - Activity与Fragment接口交互(Fragment需要把自己的数据发送至Activity) 22 | ![类与类接口交互.png](https://upload-images.jianshu.io/upload_images/10018045-1a7fdf935ba58fa4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 23 | - 上面的例子,在正常使用是没有任何问题,假如遇到以下情况: 24 | > 1)**因业务需求变换/迭代,需要修改接口的函数为无参有返回**。 25 | > 2)**新增多个Fragment时,需要创建多个不同接口类**。 26 | > 3)**接口函数中参数类型变换或者参数数量增多**。 27 | - 这些问题都会让你的代码增加**修改成本**与**难度**,而且不便于维护、迭代。 28 | ## 4.2 结合Omnipotent 29 | 那Omnipotent是如何解决这样的问题呢?我们通过上图例子结合解析如下图: 30 | ![Omnipotent原理.png](https://upload-images.jianshu.io/upload_images/10018045-1c2c932c7e535ea6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 31 | 32 | - 从上图可视,Omnipotent充当**接口的管理者同时,也是接口函数调用者,触发回调**。 33 | - Omnipotent还是类之间交互的**桥梁**,把它们之间进行**解耦**。 34 | _______________________________________________________________________________ 35 | # 5.使用 36 | ## 5.1 API使用 37 | ![API.png](https://upload-images.jianshu.io/upload_images/10018045-d5c31bd655fe8f22.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 38 | 39 | ## 5.2 如何在项目使用Omnipotent? 40 | - `第一步:` 41 | ```Android 42 | allprojects { 43 | repositories { 44 | ... 45 | maven { url 'https://jitpack.io' } 46 | } 47 | } 48 | ``` 49 | - `第二步:` 50 | ```Android 51 | dependencies { 52 | implementation 'com.github.linhaojian:Omnipotent:1.2' 53 | } 54 | ``` 55 | ## 5.3 示例 56 | ![omnipotent.gif](https://upload-images.jianshu.io/upload_images/10018045-d48400e661d290cd.gif?imageMogr2/auto-orient/strip) 57 | 58 | - **[Omnipotent示例传送门](https://github.com/linhaojian/Omnipotent)** 59 | _______________________________________________________________________________ 60 | 61 | # 6.设计思想 62 | ![设计思想.png](https://upload-images.jianshu.io/upload_images/10018045-549009f9c295ca95.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 63 | 64 | _______________________________________________________________________________ 65 | # 7.总结 66 | - 到此,`Omnipotent`库就介绍完毕,希望能在开发过程中帮助大家。 67 | - 如果喜欢我的分享,可以点击 **关注** 或者 **赞**,你们支持是我分享的最大动力 。 68 | - **[linhaojian的Github](https://github.com/linhaojian)** 69 | ### 欢迎关注[linhaojian_CSDN博客](https://blog.csdn.net/qwe851023)或者[linhaojian_简书](https://www.jianshu.com/u/ef9bd53a8cbe)! 70 | ### 不定期分享关于安卓开发的干货。 71 | _______________________________________________________________________________ 72 | #### 写技术文章初心 73 | > - 技术知识积累 74 | > - 技术知识巩固 75 | > - 技术知识分享 76 | > - 技术知识交流 77 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.lhj.omnipotent.smaple" 7 | minSdkVersion 19 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(include: ['*.jar'], dir: 'libs') 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | implementation project(':omnipotent') 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/lhj/omnipotent/smaple/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.lhj.omnipotent.smaple; 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 | * Instrumented 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() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.lhj.omnipotent.smaple", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/lhj/omnipotent/smaple/FragmentA.java: -------------------------------------------------------------------------------- 1 | package com.lhj.omnipotent.smaple; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.Toast; 11 | 12 | import com.lhj.omnipotent.OmnipotentManager; 13 | 14 | public class FragmentA extends Fragment { 15 | int count = 0; 16 | @Nullable 17 | @Override 18 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 19 | View view = inflater.inflate(R.layout.fragment,null); 20 | view.findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { 21 | @Override 22 | public void onClick(View v) { 23 | count++; 24 | //发送数据,并接收返回值 25 | String s = OmnipotentManager.getInstance().invokeInterface("btn1",count,String.class); 26 | Toast.makeText(getActivity(),s,Toast.LENGTH_SHORT).show(); 27 | } 28 | }); 29 | return view; 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lhj/omnipotent/smaple/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.lhj.omnipotent.smaple; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.Button; 7 | import android.widget.FrameLayout; 8 | import android.widget.Toast; 9 | 10 | import com.lhj.omnipotent.OmnipotentInterfaceHasParamHasResult; 11 | import com.lhj.omnipotent.OmnipotentInterfaceHasParamNoResult; 12 | import com.lhj.omnipotent.OmnipotentManager; 13 | 14 | public class MainActivity extends AppCompatActivity { 15 | private Button btn1,btn2; 16 | private FrameLayout frameLayout; 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_main); 21 | btn1 = findViewById(R.id.btn1); 22 | btn2 = findViewById(R.id.btn2); 23 | frameLayout = findViewById(R.id.framelayout); 24 | btn1.setOnClickListener(new View.OnClickListener() { 25 | @Override 26 | public void onClick(View v) { 27 | //显示Fragment 28 | getSupportFragmentManager().beginTransaction().add(R.id.framelayout,new FragmentA()).commit(); 29 | } 30 | }); 31 | btn2.setOnClickListener(new View.OnClickListener() { 32 | @Override 33 | public void onClick(View v) { 34 | new Thread(){ 35 | @Override 36 | public void run() { 37 | try { 38 | Thread.sleep(1000); 39 | } catch (InterruptedException e) { 40 | e.printStackTrace(); 41 | } 42 | //发送数据 43 | OmnipotentManager.getInstance().invokeInterface("btn2","我是线程"); 44 | } 45 | }.start(); 46 | } 47 | }); 48 | initOmnipotent(); 49 | } 50 | 51 | /** 52 | * 添加接口 53 | */ 54 | private void initOmnipotent() { 55 | //添加一个有参有返回接口函数 56 | OmnipotentManager.getInstance().addInterface("btn1", new OmnipotentInterfaceHasParamHasResult() { 57 | @Override 58 | public String function(Integer integer) { 59 | return "接收fragment发送的数据:"+integer; 60 | } 61 | }).addInterface("btn2", new OmnipotentInterfaceHasParamNoResult() { 62 | @Override 63 | public void function(final String s) { 64 | runOnUiThread(new Runnable() { 65 | @Override 66 | public void run() { 67 | Toast.makeText(MainActivity.this,"接收线程发送的数据:"+s,Toast.LENGTH_SHORT).show(); 68 | } 69 | }); 70 | } 71 | }); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 |