【问题标题】:Create a common object for whole Application为整个应用程序创建一个公共对象
【发布时间】:2014-10-22 08:23:27
【问题描述】:

我创建了一个活动来创建用户个人资料并存储其信息,例如姓名、ID、个人资料图片等。

此信息是唯一的,应在应用程序的所有活动中使用。

我想知道创建一个存储所有信息并在所有活动中使用它的通用对象的最佳方法。

我读过 bundle 和 JSON,但不明白如何使用它。

请帮助我选择什么选项。我已经做了很多阅读,但目前还不确定。请帮助我了解标准的做法以及更好的做法。

【问题讨论】:

    标签: android object android-activity android-json


    【解决方案1】:

    您可以使用Application 类在许多活动中访问同一个对象。

    public class TestApplication extends Application {
    
        //Object declaration
    
        public TestApplication () {
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void onCreate() { 
            // TODO Auto-generated method stub
            super.onCreate();
        }
    
        //setter getter for object
    }
    

    现在在您的活动中:

    //after setContentView
    TestApplication testAppObj = (TestApplication) getApplication();
    testAppObj.setSomeObj(myObj);
    
    //retrieve as:
    someObj = testAppObj.getterMethodOfObj();
    

    您必须在清单文件中注册您的应用程序类,就像您注册您的活动一样:

    <application
            android:name="com.pkg.test.TestApplication " />
    

    希望这会有所帮助。

    【讨论】:

    • 这将活动与应用程序实现联系起来,我认为这不是一个好习惯。
    • @CarlosVerdes :虽然通常不需要扩展Application(特别是如果程序员不理解其中的含义),Application 的生命周期开始了 BEFORE 任何其他应用程序组件并存在直到 AFTER 所有应用程序组件都终止(除非应用程序进程被强制终止)。简而言之,扩展 Application 并维护对全局对象的引用并没有错,尽管任何程序员都应该意识到其中的含义。
    • @CarlosVerdes :您的回答建议创建一个Service。在这种情况下,Activity 将绑定到Service。请记住 Services(绑定或未绑定,前景或背景)比扩展 Application 更复杂,但无法提供更强大的解决方案。
    • 我认为最好使用服务。您可以在类路径中添加太多服务但只有一个应用程序。但这只是一种意见,我并没有说你的解决方案不起作用。
    • 官网的另一种看法。 developer.android.com/reference/android/app/Application.html --> 通常不需要继承 Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能
    【解决方案2】:

    您可以创建自定义应用程序(如其他人所说),然后您将可以全局访问此信息,但我认为这不是一个好的设计,因为您的活动将与此应用程序实现相关联(您将无法在不同的应用程序中使用此活动)。

    我建议你实现一个服务并在所有活动中使用这个服务。

    查看下一篇文章以创建一个将对所有活动都处于活动状态的后台服务: https://developer.android.com/training/run-background-service/create-service.html

    【讨论】:

    • 我认为最好使用服务。您可以在类路径中添加太多服务但只有一个应用程序。但这只是一种意见,我并没有说你的解决方案不起作用。
    【解决方案3】:

    实现此功能的最佳方法是将数据保存在 Prefrences 中并在需要时检索。为了简化这一点,您可以直接将对象存储在首选项中,并在需要时获取该对象。

    要保存对象,您需要将 GSON 库添加到您的 libs 文件夹中,并且您可以将任何对象转换为字符串并存储在您想要的任何位置。

    对象-->>字符串 >>> Gson gson = 新 Gson();字符串 json =gson.toJson(对象);

    取回对象

    字符串 -->> 对象 >>> Gson gson = new Gson();对象对象 =gson.fromJson(json 字符串);

    上述方法将在持久存储中返回,您不会一直占用内存。 静态变量可以由系统根据内存要求释放,因此不推荐。

    【讨论】:

    • 这比应用程序方法更好,但假设从/到 JSON 序列化。如果应该在应用关闭时保存信息,这很好。
    【解决方案4】:

    Application 方式是最好的,但如果你想查看here 是常用方式的官方列表。

    【讨论】:

    • 这将活动与应用程序实现联系起来,我认为这不是一个好习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2019-06-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多