如何在单个Android应用程序中跨多个活动共享通用功能和数据

时间:2013-11-18 15:13:24

标签: android

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

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

这是我的第一个Android-Java程序,现在找到我的15,000行,34个活动应用程序需要一些结构。我知道,应该做的事情不同但应用程序的效果非常好,有两个例外。一个是它在结构上是一团糟。二是事实上这是一个烂摊子,这使我很难修复一个我想修复的行为。

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

我很感激一些指导。

4 个答案:

答案 0 :(得分:6)

为什么你不只是创建一个只有静态函数的类,传递所需的参数?例如,如果要显示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中都需要您每次都将它强制转换为您设计的特殊应用程序类。但是只有静态的类在使用上非常灵活,不需要实例就可以工作。

答案 1 :(得分:4)

对于存储问题:

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

对于方法问题:

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

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

public class Activity1of34 extends MyParentActivity {
    myMethod();
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我,其中一个,不介意单身模式。当然,其他一切都不应该被滥用。

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

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()的启动画面。

创建实例后,我可以调用:

SharedDataObject.getInstance().myMethod();

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