我可以依靠声明应用程序Context
在应用程序的生命周期内没有变化吗?如果我context
使用单例模式存储某个地方然后在需要的地方使用怎么办?
7 回答
首先回答你的第二个问题:如果你需要在单例中存储一些状态,那么你可以使用 AndroidApplication
类,你的Application
成为你的单例(它也是一个Context
)。没有必要存储它。
对于第一个问题,关于是否Context
可以在运行时更改:与您的其他问题有关,我认为我们可以通过查看ContextWrapper.attachBaseContext
:
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
所以,是的,你可以依靠它;它不能改变,如果你尝试,它会抛出一个IllegalStateException
.
AndroidApplication
类是您的单例,用于存储应在应用程序生命周期阶段跟踪的信息。您可以在手册中查看此类的描述 - http://developer.android.com/reference/android/app/Application.html
应用程序是一个单例,我不知道在不改变核心的情况下绕过它的方法。
但是,如果您的代码启动另一个进程,则可能会遇到 Application 对象的 2 个实例。一个例子是启动远程服务;这将创建另一个进程,该进程将创建它自己的应用程序对象实例。
http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample
为避免混淆,您必须使用 Parcelable 或 Serializable android 选项之一在远程服务和应用程序的其余部分之间进行通信:
消息 - 处理程序意图捆绑意图 putExtra
或创建您自己的一个
围绕这个话题存在一些争议。甚至一些来自谷歌的人。我坚持我认为是正确的方法,它基本上试图尽可能多次地获取活动上下文。原因是,上下文的重点是为您的应用程序的一些资源/部分提供工作环境。您提供给系统的信息越准确,发生的意外行为就越少(即:您只能访问 Activity 上下文范围内的某些资源以及从应用程序上下文访问的方式。
请记住,活动是一个上下文,因此如果您在活动内部,则传递“this”将完成工作,如果您的代码在片段内工作,则传递“getActivity()”。
此外,我必须同意 devmiles.com。将您自己的 Application 类用作 Singleton 非常有用,因为您可以轻松管理应用程序的生命周期并将其用作适当的中间点。再一次,要获取 appContext,调用 getApplicationContext 甚至是 Application 单例类的实例就足够了。
In application class is a singletion application level class for android application. My answer is no you can not change application context object.
虽然这里的最佳答案在技术上是正确的,但它与谷歌当前的建议背道而驰,页面下方引用了以下内容:
https://developer.android.com/reference/android/app/Application.html
"注意:通常不需要继承 Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),请包含 Context.getApplicationContext( ) 在调用单例的 getInstance() 方法时作为 Context 参数。”
简而言之,存储生命周期与您存储它的类的生命周期不匹配的上下文是危险的。应用程序上下文应该与您的单例的生命周期相匹配,因为它们共享相同的进程生命周期。