构建 UI 实用程序的最佳方式 class

Best way to build an UI utility class

我想构建一个实用程序 class。它应该从数据库中读取值并提供典型的 UI 或交互功能,例如设置应用标题,设置背景图片,播放背景音乐。

因为问了另一个问题 我意识到我有很多不同的方法可以做到这一点。我测试了不同的方法来设置标题,每种方法都有效。但哪种方式最干净/正确/自信,为什么?

在示例中调用 class 是 kotlin class,但这无关紧要。

方法一! Activity 相关的一切都在调用 activity 中完成。上下文通过构造函数传递,也可以在每次函数调用时调用。 在我看来,我们确实没有那么多依赖性,但实用程序用户必须自己做很多事情。

呼叫class:

frameworkFeatures(applicationContext);
setTitle(frameworkFeatures.frameworkSetTitlesStaticContext());

呼叫 class:

  private static Context frameworkContext;

    public frameworkFeatures(Context context) {

        frameworkContext = context;

    }

  public static String frameworkSetTitlesStaticContext(){

        TestMainDatabase.getDatabase(frameworkContext);
        TestMainDatabase db = RoomAsset.databaseBuilder(frameworkContext, TestMainDatabase.class, "TestMainDatabase.db").allowMainThreadQueries().build();
        return db.featuresDao().findByName("title").getFeatureValue().toString();

    }

方式二。尽量躲起来。一切都必须传递给实用程序 class。当被 more Activity 使用时如何处理这个问题。在实用程序 class 中使用静态 Activity 声明是否仍然可行?

呼叫 class:

    frameworkFeatures(applicationContext,this)
    frameworkFeatures.frameworkSetTitleEverythingisStatic()

呼叫 class:

private static Context frameworkContext;
private static Activity frameworkActivity;
private static TestMainDatabase frameworkTestMainDatabase;

public frameworkFeatures(Context context, Activity activity){

    frameworkContext = context;
    frameworkActivity = activity;

    TestMainDatabase.getDatabase(context);
    frameworkTestMainDatabase = RoomAsset.databaseBuilder(frameworkContext,TestMainDatabase.class, "TestMainDatabase.db").allowMainThreadQueries().build();


}

public static void frameworkSetTitleEverythingisStatic(){

    frameworkActivity.setTitle(frameworkTestMainDatabase.featuresDao().findByName("title").getFeatureValue().toString());

}

如果您需要有效的 context/activity,您可以改为提供应在 Application onCreate() 中调用的初始化 API。像 :

Framework.initialize(appContext); 

您可以在其中注册您自己的 Application.ActivityLifecycleCallbacks 以跟踪当前 visible/active activity:

public static void initialize(Application context) {
    appContext.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
       ...
       @Override
       public void onActivityResumed(Activity activity) {
           sGlobalContext = activity; 
       }
       @Override
       public void onActivityPaused(Activity activity) {
           sGlobalContext = null; 
       }
       ....
    ...
}

然后你的框架就不用再担心 activity/context 了。对于用户,一切都是透明的。