Android免费/付费 - 使用库的架构

时间:2012-06-24 08:42:16

标签: android

我需要创建一个免费且付费版本的应用程序,因此我使用的是具有常见活动和资源的库项目。但是我想知道如何组织这个:

当用户单击按钮时,共享(库)活动MyActivity.java会启动DialogFragment。 DialogFragment对于免费和付费应用程序会有所不同。对于免费应用,我们将启动FreeDialog.java,对于付费,我们将启动PaidDialog.java。这两个对话框片段不在库项目中,因为它们不共享;他们将分别在免费和付费项目中。

我唯一能想到的就是将MyActivity.java抽象化并将其扩展到免费和付费项目中。扩展将启动各自的DialogFragments。

另一种方法可能是在每个项目中重载Fragments。但是,我不确定这是否可行。

1 个答案:

答案 0 :(得分:3)

理论上,你可以使MyActivity抽象,并在付费和免费的应用程序项目中将其子类化。但是,Activity类与普通的Java类略有不同,这使得复杂化。它们列在AndroidManifest.xml中,然后也不是通过 newing 创建的。它们通常是使用Intent创建的。所以,我想我不会让Activity成为一个抽象类。

我认为您真正想要的是使用类似于Factory pattern来创建DialogFragment的实例,其中您的公共库不知道将创建哪个DialogFragment。你可以对工厂非常喜欢,你可以在其他地方阅读所有相关内容,但一个简单的工具可能适合你:

public class FragmentFactory {

   private static String _dialogFragmentClassName;

   public static void registerFragment(String className) {
      // you might choose to assert if _dialogFragmentClassName != null
      _dialogFragmentClassName = className;
   }

   public static DialogFragment createFragment() {
      try {
         return (DialogFragment) Class.forName(_dialogFragmentClassName).newInstance();
      } catch (Exception e) {
         return null;
      }
   }
}

然后,在您的免费和付费应用程序项目代码中,您将在启动时发出这样的调用(例如在主Activity中):

FragmentFactory.registerFragment(com.mycompany.free.FreeDialogFragment.class.getName());

FragmentFactory.registerFragment(com.mycompany.paid.PaidDialogFragment.class.getName());

最后,在公共库代码中,您可以通过调用

来创建片段的实例
DialogFragment fragment = FragmentFactory.createFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_content, fragment);
ft.commit();