【问题标题】:How can a code in a library project call code in the application project?库项目中的代码如何调用应用程序项目中的代码?
【发布时间】:2012-01-08 22:16:34
【问题描述】:

为了减少重复,我将应用的工作区拆分为 3 个项目:

  • Main(一个库项目,所有常用代码都存放在其中)
  • 免费(制作免费版)
  • 付费(制作付费版)

免费版和付费版的行为有时会有所不同。如何从库项目中“调用”最终项目?

这里有一些示例伪代码来说明我的问题:

在主项目中:

private void makeADecision() {
    if (AppCode.isPaid()) {
        // do one thing
    } else {
        // do something else
    }
}

在免费项目中:

public class AppCode {
    public static bool isPaid() {
        return false;
    }
}

在付费项目中:

public class AppCode {
    public static bool isPaid() {
        return true;
    }
}

这基本上是我尝试过的,但它不会编译,因为 Main 项目不知道 AppCode 类。

请记住,这只是一个示例,因此请不要关注应用如何判断它是否为付费版本。 :) 到目前为止,我发现的最佳解决方案是将字符串放入所有三个项目的资源中,然后根据其价值做出决定,但我不喜欢这种方法。除了丑陋之外,我更愿意将功能保留在它所属的地方。这样我就可以完全防止“仅付费”功能被编译到免费版本中,并且可以避免在付费版本中包含任何“仅免费”代码。

【问题讨论】:

    标签: android


    【解决方案1】:

    步骤#1:在库中定义一个接口,以便所有三方都可以使用它,其方法是您希望库在应用程序上执行的任何操作

    第 2 步:让应用通过一些库提供的 API 向库提供接口的实现

    第 3 步:根据需要在提供的接口上调用库方法

    【讨论】:

      【解决方案2】:

      我认为从库中调用主应用程序不是一个好主意,即使可以。

      相反,我会在库中添加一个公共静态布尔值,并在它第一次启动时从您的应用程序中设置它。

      public class MyLibrary {
          public static boolean IS_PAID = false;
      
          public void makeADecision() {
              if(IS_PAID) {
                  // do one thing
              } else {
                 // do something else
              }
          }
      }
      

      在您的主应用程序中,您可以执行类似

      的操作
      com.yourname.yourlib.MyLibrary.IS_PAID = true;
      

      设置它。由于它不是最终的,您可以随时更改它的状态。如果它是更复杂的行为,您可以使用公共静态侦听器或回调,您可以从完整/免费应用程序中分配它,然后从您的库中调用它

      【讨论】:

        【解决方案3】:

        您可以使用反射来实现这一点 - 请注意这通常不是一个好主意。

        例如:

        static private boolean isAppPaid;
        
        static {
            try {
                Class c = Class.forName("your.package.AppCode");
                Method m = c.getMethod("isPaid");
                isAppPaid = (boolean) m.invoke(null);
            }
            catch (Exception e) {
                isAppPaid = false;
            }
        }
        

        我的代码中可能有错误 - 我从未经常使用 Java 反射。

        编辑:我同意 Tseng 的观点,即让库调用应用程序代码充其量是值得商榷的。 (除非所述库是接管客户端应用程序的框架。)

        【讨论】:

          【解决方案4】:

          您还可以将免费和付费版本制作为 makeADecision 所在类的子类,并以这种方式实现单独的行为。

          所以主要

          public class BaseClass {    
              ...    
              public void makeADecision() {}
              ...
          }
          

          免费

          public class FreeClass extends BaseClass {
          ...
              public void makeADecision() {
                  //free implementation here
              }
          ...
          }
          

          付费

          public class PaidClass extends BaseClass {
          ...
              public void makeADecision() {
                  //paid implementation here
              }
          ...
          }
          

          【讨论】:

            【解决方案5】:

            Tseng 解决方案是一种简单直接的解决方案。谢谢,这是我用过的。另外,我发现那篇文章可以帮助您实施解决方案:

            http://www.firstlightassociates.co.uk/blog/2011/software/android-software/managing-free-and-paid-android-applications-2/

            希望对你们中的一些人有所帮助!

            干杯

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-01-14
              • 1970-01-01
              • 1970-01-01
              • 2021-03-14
              • 2016-02-27
              • 2022-12-24
              • 2017-05-30
              相关资源
              最近更新 更多