android - MainActivity.this 与 getApplicationContext() 有什么不同

标签 android android-context

我正在尝试 ProgressDialog。但我很困惑。

1. pd=ProgressDialog.show(MainActivity.this, "", "Fething data");

当我使用 (MainActivity.this) 时就可以了。但是

2. pd=ProgressDialog.show(getApplicationContext(), "", "Fething data");

当我使用 (getApplicationContext()) 时,它是错误的。

这个progressDialog有什么问题?

(MainActivity.this) 与 (getApplicationContext())

有什么不同

当我使用它的最佳时机?

对于 getApplicationContext() 错误是:

04-09 15:05:37.453: E/AndroidRuntime(9980): FATAL EXCEPTION: main
04-09 15:05:37.453: E/AndroidRuntime(9980): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.Dialog.show(Dialog.java:281)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ProgressDialog.show(ProgressDialog.java:116)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ProgressDialog.show(ProgressDialog.java:99)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ProgressDialog.show(ProgressDialog.java:94)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at com.example.shikkok_services.MainActivity$2.onClick(MainActivity.java:27)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.View.performClick(View.java:4204)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.view.View$PerformClick.run(View.java:17355)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.os.Handler.handleCallback(Handler.java:725)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.os.Looper.loop(Looper.java:137)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at java.lang.reflect.Method.invokeNative(Native Method)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at java.lang.reflect.Method.invoke(Method.java:511)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-09 15:05:37.453: E/AndroidRuntime(9980):     at dalvik.system.NativeStart.main(Native Method)

最佳答案

Which context to use?

有两种类型的上下文:

应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终相同;它没有改变。因此,如果您使用 Toast,您可以使用应用程序上下文甚至 Activity 上下文(两者),因为 Toast 可以从应用程序中的任何位置显示,而不是附加到特定的 window 。但也有很多异常(exception)。一个这样的异常(exception)是当您需要使用或传递 Activity 上下文时。

Activity上下文与activity相关联,如果activity被销毁则可以被销毁;单个应用程序可能有多个 Activity (很可能)。有时您绝对需要 Activity 上下文句柄。例如,如果你启动一个新的 Activity,你需要在它的 Intent 中使用 Activity 上下文,以便新启动的 Activity 在 Activity 方面连接到当前 Activity堆。但是,您也可以使用应用程序的上下文来启动新的 Activity ,但是您需要在 Intent 中设置标志 Intent.FLAG_ACTIVITY_NEW_TASK 以将其视为新任务。

让我们考虑一些情况:

MainActivity.this 指的是 MainActivity 上下文,它扩展了 Activity 类但基类 (Activity)还扩展了 Context 类,因此可以用来提供 Activity 上下文。

getBaseContext() 提供 Activity 上下文。

getApplication() 提供应用程序上下文。

getApplicationContext() 还提供应用程序上下文。

欲了解更多信息,请查看 link .

关于android - MainActivity.this 与 getApplicationContext() 有什么不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966601/

相关文章:

Android AdMob - 请求欧洲用户的同意

android - 状态栏后面的布局 - Android Lollipop

android - Java 绑定(bind)项目中的 Xamarin.Android 是否可以使用 Java 8 功能?

android-asynctask - Android 上下文弱引用

java - 从 SurfaceView 内部启动 Activity

android - 如何使具有多个子布局的 RelativeLayout 的 ScrollView 充满屏幕?

android - 如何将消息发布到 native Android 应用程序内的 Web View ?

android - 在 Android api 级别 27 中将 getContext() 覆盖为非空是个坏主意?

android - Android 中特定于 fragment 的选项和上下文菜单

java - 取消具有不同上下文的警报