可以在应用程序生命周期中更改应用程

时间:2012-07-15 08:43:02

标签: android

在应用程序的生命周期中,应用程序的Context是否可以依赖语句?如果我使用单例模式在某处存储context然后在我需要的地方使用该怎么办?

7 个答案:

答案 0 :(得分:14)

首先回答你的第二个问题:如果你需要将某个州存储在一个单身人士中,那么你可以使用Android Application课程,而Application成为你的单身人士(它也是Context 1}})。没有必要存储它。

关于第一个问题,关于Context是否可以在运行时更改:与your other question相关,我想我们可以通过查看ContextWrapper.attachBaseContext来解决这个问题:< / p>

 protected void attachBaseContext(Context base) {
     if (mBase != null) {
         throw new IllegalStateException("Base context already set");
     }
     mBase = base;
 }

所以,是的,你可以依靠它;它无法更改,如果您尝试,它将抛出IllegalStateException

答案 1 :(得分:6)

Android Application类是您存储应通过应用程序生命周期阶段跟踪的信息的单例。您可以在手册中查看此课程的说明 - http://developer.android.com/reference/android/app/Application.html

答案 2 :(得分:1)

围绕这个话题存在一些争议。甚至是谷歌人中的一些人。 我保持我认为是正确的方法,它基本上试图尽可能多地获取活动上下文。原因是,上下文的重点是为应用程序提供一些工作环境。您提供给系统的信息越准确,就会发生意外行为越少(即:您只能访问活动上下文范围内的某些资源以及从应用程序上下文开始的方式。

请记住,活动是一个上下文,因此,如果您在活动中,则传递“this”将成为作业,如果您的代码在片段内工作,则传递“getActivity()”。

此外,我必须同意devmiles.com。将您自己的Application类用作Singleton非常有用,因为您可以轻松管理应用程序的生命周期并将其用作适当的中间点。再一次,要获取appContext,只需调用getApplicationContext甚至是Application单例类的实例。

答案 3 :(得分:1)

是的,你可以依赖于在应用程序生命周期中不改变上下文!

Google在Application课程概述中这样说。

我认为这对你的案子来说是完美的。

答案 4 :(得分:1)

应用程序是单例,我不知道如何在不更改核心的情况下绕过它。

但是,如果您的代码启动另一个进程,则可能会遇到2个Application对象实例。一个例子是启动远程服务;这将创建另一个进程,它将创建自己的应用程序对象实例。

http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample

为避免混淆,您必须使用Parcelable或Serializable android选项之一在远程服务和应用程序的其余部分之间进行通信:

消息 - 处理程序 意图捆绑 意图putExtra

或创建自己的

答案 5 :(得分:0)

在应用程序类中是android应用程序的单例应用程序级别。我的回答是,你不能改变应用程序上下文对象。

答案 6 :(得分:0)

尽管此处的最佳答案在技术上是正确的,但它与Google当前的建议背道而驰,以下页面引用了该建议:

https://developer.android.com/reference/android/app/Application.html

“注意:通常不需要子类化Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如,注册广播接收者),请包含Context。 .getApplicationContext()作为调用单例的getInstance()方法时的上下文参数。”

简而言之,存储其生存期与您在其中存储的类的生存期不匹配的上下文是危险的。应用程序上下文应与单个实例的生存期匹配,因为它们共享相同的进程生存期。