一个活动继承一个上下文。AlertDialog.Builder 指定了一个 Context 参数,因为它可以被作为 Context 子类的任何类使用,包括 Activity、ListActivity、Service ......(这背后有一个常见的编码习惯 - 你可以了解更多关于它的信息通过阅读 Joshua Bloch 出色的 Effective Java 中的 Item I8(关于接口和抽象类)。
getApplicationContext() 返回您的应用程序的上下文,这与您的活动上下文基本相同 - 而“大部分”是让您失望的原因。细节尚不清楚,但这是一个广泛遇到的问题,典型的答案是使用将警报写入屏幕的上下文。请注意,这不是getApplicationContext() 返回的那个。
现在,如果您像我一样,您可能会说“但我正在一个不继承自 Activity 的类中工作——这就是为什么我首先要为此使用 getApplicationContext() ——嗯!” 我实际上并没有那样粗鲁地说;p ..关键是我也来过这里。我这样修复它:1)问自己“我是否在非活动类中有我的 UI AlertDialog 代码,因为我想跨活动共享它......甚至跨 ListActivities、服务......?”。如果没有,嗯......你真的有代码中的 AlertDialog UI 调用,你不能保证可以访问 UI(以及上下文)吗?如果是这样,请重新考虑您的设计。
假设您确实想在活动中分享这门课,……答案就很清楚了。您希望您的类可供各种调用者使用,每个调用者可能都有自己的上下文:因此调用者必须将其上下文作为参数传递给您的类:
myClass(Context theContext, ...) { ... }
然后,每个活动、服务等都会进行如下调用:
myClass(this, ...);
看起来熟悉?
一定要小心!如果您正在共享代码,则必须考虑不同调用并行进入您的共享代码的可能性,以及所有许多后果。这超出了我们的范围......
玩得开心 :)