在android中存储非可序列化对象实例的最佳方法是什么?

时间:2011-08-24 07:21:08

标签: android

我有一个继承自BroadcastReceiver的类,并且必须侦听PHONE_STATE事件。在onReceive方法的内部,我需要一个必须始终完全相同的对象实例(至少在状态响铃和下一次出现的ide / offhook之间)。这意味着我需要将对象存储在某个地方。它不能被序列化,也不能存储在数据库或SharedPreferences中。

我想到了两种不同的方法:

  1. 使用静态变量。缺点:没有人知道android会删除它。
  2. 使用服务。缺点:服务需要在第一次调用时启动然后绑定。这是一个异步调用,我可能不得不等待一段不确定的时间。使用服务只是为了存储一个单独的对象似乎也是错误的。
  3. 任何其他更好的想法?

2 个答案:

答案 0 :(得分:1)

不知道它是否适用于您的情况,但我通常在SharedPreferences中存储对象的字符串表示。您可以覆盖toString()方法,该方法将创建字符串表示形式,并实现一个parse()方法,该方法将解析保存的字符串并根据其保存的状态初始化对象。希望这会有所帮助。

答案 1 :(得分:0)

第三个3)使用自定义类的单例实例,然后你可以从调用到调用获得变量,但不是持久性(如果应用程序停止)。但是在运行时应用程序生命中从一个时间到另一个时间是有用的。为了尽可能避免通过android框架擦除数据,你可以将你的单例绑定到一个“前景”服务,看看http://developer.android.com/reference/android/app/Service.html#startForeground(int,%20android.app.Notification)通过这种方式获得更高的内存破坏保护。这就是我目前的方式在服务中使用单身人员......长时间执行(正常和重负荷活动约2周)没有任何麻烦......


这里是单身例子

class MyData {
   private static MyData mMydata= null; // unique reference ( singleton objet container)

   private MyObject myobject = null; // inside the unique object container we have the unique working object to be use  by the application
   // can't make instance from outside... we want to have single instance
   // we want that outside use method "getInstance" to be able to use the object
   private MyData() {
   }

   // retrieve and/or create new unique instance
   public static MyData getInstance() {
     if (mMydata ==  null) mMyData = new MyData();
     return   mMyData;
   }

   // Works with your memory stored object
   // get...
   public myObject getMyObject() {
   return myobject;
   }
   // set ...
   public void setMyObject(MyObject obj) {
    myobject = obj;
   }
}


在您处理“工作”对象的申请中,您可以像使用

一样访问它
// get object
MyObject obj =  MyData.getInstance().getMyObject();
// or set a object
MyData.getInstance().setMyObject(obj);