我如何在一个android应用程序中的许多活动中共享通用功能和数据



我正在寻找如何在单个应用程序中跨多个活动共享功能和数据。我研究了它的细节,发现在覆盖应用程序的扩展和执行单例之间存在一些意识形态战争,我找不到足以让我理解的例子。基本上我想共享数据和功能。所有活动都需要相同的功能和数据,因此这不是一个活动与另一个活动共享数据。所有活动都需要访问相同的功能和数据。

我想知道的是该怎么做。我需要看看我在34个活动中需要做什么,将要通用的类是什么样子,以及Manifest条目需要是什么。我还需要确保通用数据区域不会被操作系统关闭。

这是我的第一个Android-Java程序,现在发现我的15000行,34个活动的应用程序需要一些结构。我知道,应该采取不同的做法,但该应用程序运行得很好,只有两个例外。一个是它在结构上一团糟。第二,它一团糟,这让我很难纠正我想纠正的一种行为。

这是一个基于GPS的帆船比赛应用程序。它是时间关键的,每个活动基本上在位置管理器onLocationChanged函数内每秒运行一次循环。那部分很好,我不想把GPS代码放在一个地方。问题是,大多数活动都需要过滤数据,因此会将大量代码复制并粘贴到活动中。过滤器需要历史记录,因此需要记住一个状态。还有一些活动使用的其他功能,因此这些功能也被复制了。想象一个函数,对最后三个GPS速度读数取平均值。它需要保存一些历史,做自己的事情,并给出一个结果。所有活动都需要做完全相同的事情。所有这些都有效,但问题是每次切换活动时都会开始平均,因为每个活动都有自己的过滤器。这给了我需要处理的数据中的一个小故障。我需要一个保存数据的公共位置,希望有一个运行过滤和其他公共功能的公共位置。如果每个活动都可以调用使用公共状态数据的筛选函数,那么活动更改之间就不会出现故障。

我希望得到一些指导。

为什么不只创建一个只有静态函数的类,并传递所需的参数?如果您想显示ErrorDialog 的示例

public class SharedHelper{
    public static Dialog showErrorDialog(Context ctx, String message, String title, DialogInterface.OnClickListener okListener, DialogInterface.OnClickListener cancelListener){
        AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
        builder.setMessage(message).setTitle(tilte);
        if (okListener != null){
            builder.setPositiveButton(R.string.button_positive, okListener);
        }
        if (cancelListener != null){
           builder.setNegativeButton(R.string.button_negative, cancelListener);
        }
        return builder.show();
    }
}

单身汉(在我看来)是最丑陋的设计模式之一,迟早会咬你一口。在Application中放入任何内容都需要每次将其强制转换为您设计的Special Application类。然而,只有statics的类在使用上非常灵活,不需要实例即可工作。

对于存储问题:

查找"SharedPreferences"&"SQLite",然后决定哪种存储类型更适合您的需求。

对于方法问题:

这个问题有点复杂,有不同的方法可以解决。例如,你可以编写一个实现所有全局所需问题的父类,并让所有活动类从中继承。

public class MyParentActivity extends Activity {
    public void myMethod() {
    }
}

和:

public class Activity1of34 extends MyParentActivity {
    myMethod();
}

我认为这不是Android的问题,而是面向对象编程的问题。如果我正确理解这种情况,我敢打赌最好的解决方案是使用共享过滤器,并创建一个新的过滤器类,该类在每个活动中实例化(这可能比单例更容易管理,但没有看到您的用例,很难说是肯定的)。如果需要集中跟踪平均值,只需在Filter类中创建一个静态变量,该变量在应用程序的生命周期中保持相同的值。如果您真的想保持这个平均值(即使超过了应用程序的当前生命周期),您可以将其持久化到数据库或其他本地数据选项中。然而,我看不出有任何理由仅仅为了保持平均值就把所有东西都放在一个单例中。如果使用不正确,Singleton(以及所有静态数据结构)可能会带来潜在的麻烦。

我不介意singleton模式。当然,和其他一切一样,它不应该被滥用。

这是我用于共享对象的构造。我的应用程序以这种方式分为多个模块,但也可以在您的情况下使用。

public class SharedDataObject {
    private Context context;
    private static SharedDataObject instance;
    public static SharedDataObject getInstance() {
        if (instance == null) throw new RuntimeException("Reference to SharedDataObject was null");
        return instance;
    }
    public static SharedDataObject createInstance(Context context) {
        if (instance != null) {
            return instance;
        }
        return instance = new SharedDataObject(context.getApplicationContext());
    }
     // notice the constructor is private
     private SharedDataObject(Context context) {
         this.context = context;
     }
    ...
    public void myMethod() {
        // do stuff
    }
}

请注意,它使用了应用程序上下文,这意味着SharedDataObject拥有的上下文不能用于GUI操作。但是,上下文将在应用程序的整个生命周期中存在,这很好。

此外,我讨厌每次在SharedDataObject上调用方法时都要传递上下文,因此我在所有模块上都有一个调用SharedDataObject.createInstance()的splashscreen。

一旦创建了一个实例,我就可以调用:

SharedDataObject.getInstance().myMethod();

在我的代码中的任何地方,无论上下文是否存在(从调用该代码的地方)。

相关内容