【问题标题】:Where to declare functions which are used in every activity? [duplicate]在哪里声明每个活动中使用的函数? [复制]
【发布时间】:2021-04-05 06:31:34
【问题描述】:

我在 Activity 的 onCreate 函数中调用一个函数来重构我的代码。我想知道在哪里声明这个可能在我的应用的每个 Activity 中使用的函数。

我所做的(它工作正常)是创建一个带有companion object 的函数类,其中声明了我的所有全局函数。但我的问题是:这样做是不是一个好方法?

【问题讨论】:

    标签: android oop kotlin


    【解决方案1】:

    我在活动的 onCreate 函数中调用一个函数来分解我的 代码。我想知道在哪里声明这个可能使用的函数 在我的应用程序的每个活动中。

    我会创建一个BaseActivity 并让您的所有活动都继承自它。

    abstract class BaseActivity : AppCompatActivity() {
        private fun init() {
            // your code
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            init()
        }
    }
    

    如果你的 init 函数不依赖于来自子类的任何东西,你可以每次都在 onCreate 中调用它(如上所示),否则将其设为 protected 并从子类中调用它(带参数)。

    我所做的(它工作正常)是创建一个具有 声明了我的所有全局函数的伴随对象。但我的 问题是:这样做是不是一个好方法?

    这取决于您是否需要全局共享状态。在第一种情况下,使用objectcompanion object 并不是一个坏主意。

    如果您不需要全局状态,或者不需要以任何状态将什么传递给实用程序函数本身,那么*函数就足够了。

    Utils.kt

    fun someUtilityFunction(foo: Int) {
        // ...
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建一些 BaseActivity 或 YourAppNameActivity 并在其 onCreate 中调用您的函数。然后,每个扩展 BaseActivity 的活动通常都会调用 super.onCreate() 以及您需要的代码

      【讨论】:

        【解决方案3】:

        只要您没有共享(可变)状态(因为它会导致副作用,将通用代码放入伴随对象中没有任何问题。

        您可以使用 BaseActivity 扩展您的活动,但我会尽量避免继承以支持组合。

        【讨论】:

        • but I would try to avoid inheritance in favor of composition. 绝对是干净代码的追随者 :) 虽然我完全同意这个答案(并感谢参考),但我认为继承在这里并不是一个坏主意,尽管创建一个对象或辅助类(作为组合的一部分)将是一个替代方案
        【解决方案4】:

        如果您的方法正在触及活动的视图,那么BaseActivity 方法就可以了。但如果它不将其移至某个单例 ActivityHelper 类。

        就像说的那样,BaseActivity 方法(继承)是有代价的。你应该能够做出好的设计选择,不要把所有东西都放在里面,这最终会使它更加耦合。

        仅当您发现您的代码干扰了其生命周期时才遵循组合模式。 activityfragment 的一些 registerLifecycle 回调可以帮助您。

        【讨论】:

          【解决方案5】:

          将所有公共代码移动到父类并让每个活动继承该父类是一个很好的做法,顺便说一句,创建伴生对象是一个不错的选择,只有当你想创建一个单例时,才需要一个单例当您只想将该对象实例化一次时。

          例如baseActivity(父类)中的一个函数来创建一个intent filter或者添加代码到onCreate函数中

          public class BaseActivity extends Activity {
          public static final String FINISH_ALL_ACTIVITIES = "somecode";
          public final IntentFilter INTENT_FILTER = createIntentFilter();
          private boolean _started;
          
          private IntentFilter createIntentFilter() {
              IntentFilter filter = new IntentFilter();
              filter.addAction(FINISH_ALL_ACTIVITIES_ACTIVITY);
              return filter;
          }
          
          // region Blindaje de eventos ciclo de vida
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              // inside your activity (if you did not enable transitions in your theme)
              getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
              super.onCreate(savedInstanceState);
              try {
                  doOnPostCreate(savedInstanceState);
              } catch (Throwable t) {
                  doOnErrorNoControlado(t);
              }
          }
          

          【讨论】:

          • 一些代码示例很有帮助。