2013-04-22 121 views
12

我正在开发一个自定义应用程序类的应用程序,该应用程序初始化几个单身人士,以便他们在所有应用程序工作时间内居住。我的应用程序中也有一些与这些单身人士合作的服务。是否有可能出现这样的情况:应用程序类将在android之前被单例实例销毁,因此服务将无法使用它们?或者应用程序总是为了上下文的服务而生活?找到摆脱这种情况的最佳途径是什么?服务运行时的应用程序类生命周期

谢谢。

回答

5
  • 关于适用对象:

应用程序对象是任何Android应用程序的主要绝对起点。在任何Manifest声明项目(如Activity,Service和BroadcastReceiver)之前,它始终存在。所以放松,单身人士将在那里为你。

  • 关于单PARADIGMA:

这是一个大讨论的话题,你可以google更多关于它所以接下来我就可以了个人意见。不管你的单例(数据库,位图缓存,FileUtils)是什么原因,我认为在应用程序的第一个入口点初始化它们是正确和正确的。但是,应用程序本身并不意味着携带或持有这些对象的对象,这样,我建议的设计方法是:

=>在你单身的对象/类,你就必须:

private static MySingletonClass instance; // reference to the single object 
private MySingletonClass(Context c){ // private constructor to avoid construction from anywhere else 
    // let's say it needs the context for construction because it's a database singleton 
} 
public static MySingletonClass get(){ // 
    if(instance == null) throw new RuntimeException("This singleton must be initialised before anything else"); 
    return instance; 
} 
public static void init(Context c){ // call the initialisation from the Application 
    instance = new MySingletonClass(c); 
} 

=>然后您的应用程序对象您只需初始化的单身

onCreate(){ 
    MySingletonClass.init(getApplicationContext()); 
} 

用这种方式,你会保持必要的初始化,执行Singleton模式,但访问你不要打电话到该对象类的应用程序中的对象。我知道这只是一个组织上的差异,但我相信这就是单独的好的和坏的代码。

因此,例如在您的服务上的电话是:MySingletonClass.get(),不应该是MyApplication.mySingle

希望它有帮助。

+0

是的,我现在有这样的代码。但有时我不知道为什么我的服务抛出NullPointerException,当我尝试在这里使用单例的字段例如.. – 2013-04-22 14:00:15

+1

这就是为什么我包含'抛出新的RuntimeException'行。这样你就可以确定由于那个或其他原因而失败了。其他方法是绝对可以肯定的,即使GC杀死它,因为服务确实有上下文,你可以在'init()'中放一个代码if(instance == null)来只在需要时初始化并调用init从服务也。 – Budius 2013-04-22 14:05:36