首页 文章

差异以及何时使用getApplication(),getApplicationContext(),getBaseContext()和someClass.this

提问于
浏览
111

我试图理解 getApplication()getApplicationContext( ), getBaseContext()getContext()someClass.this 之间的区别,尤其是何时在以下代码行中使用这些方法:

当我发起祝酒时,这些和我使用它们之间有什么区别?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

与意图相同:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);

4 回答

  • 23

    ToastIntent ,都需要引用上下文 . 并且 getApplicationgetApplicationContextLoginActivity.thisgetBaseContext ,它们都提供了对上下文的引用 .

    现在令人困惑的是声明不同的上下文及其具体用法 . 为简单起见,您应该计算Android框架中可用的两种类型的上下文 .

    • 应用程序上下文

    • 活动背景

    Application 上下文附加到应用程序的生命周期中,并且在应用程序的整个生命周期中始终相同 . 因此,如果您正在使用Toast,则可以使用应用程序上下文甚至活动上下文(两者),因为可以从应用程序中的任何位置引发Toast,并且不会将其附加到窗口 .

    Activity 上下文附加到Activity 's life-cycle and can be destroyed if the activity' s onDestroy() 被引发 . 如果要启动新活动,则必须在其Intent中使用活动的上下文,以便新的启动活动连接到当前活动(就活动堆栈而言) . 但是,您也可以使用应用程序的上下文来启动新活动,但是您需要将intent Intent.FLAG_ACTIVITY_NEW_TASK 设置为intent以将其视为新任务 .

    现在提到你的案例:

    LoginActivity.this 虽然它引用了你自己的类,它扩展了Activity类,但基类(Activity)也扩展了Context类,因此它可以用来提供活动上下文 .

    getApplication() 虽然它引用了Application对象但Application类扩展了Context类,所以它可以用来提供应用程序上下文 .

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

    getBaseContext() 提供活动背景 .

    提示:每当您需要操作视图时,请转到Activity-Context,否则Application-Context就足够了 .

  • 193

    Waqas的答案非常明确和完整,但是我想进一步澄清使用 thisgetBaseContext()getApplication()getApplicationContext() 之间的区别 . ActivityApplication 都不是 Context 本身,而是 ContextWrapper ,这是一个

    “代理将Context的所有调用委托给另一个Context的Context的实现” .

    那个"real"上下文就是你用 getBaseContext() 得到的 .

    因此,尽管 this (对于 Activity )和 getBaseContext() 都给出了活动背景,

    • (a)不要引用同一个对象( this != getBaseContext() )和

    • (b)通过 this 调用上下文的效率稍差,因为调用会通过额外的间接级别 . 不过,我怀疑它是否有任何实际意义 .

    相同的逻辑适用于 getApplication()getApplicationContext() .

  • 0
    LoginActivity.this
    

    上面的行是一个活动,它是一个上下文 . 这是在你创建一些AlertDialogs时使用的......在某些地方它必须使用Activity Context ...

    getApplication()
    

    同样的make文本方法需要Context和Application本身实现 Context

    getApplicationContext()
    

    这是最优选的方式,因为 Context 直到应用程序关闭 .

    getBaseContext()
    

    此上下文可用于窗口小部件和视图 .

    但是所有这些都给出了一个 Context 对象而没有别的......

  • 6

    Class.this如果你的类扩展了Activity getapplication()使用了引用应用程序和应用程序扩展应用程序上下文getbasecontext()引用你的活动上下文上下文引用你的活动生命周期上下文applicationcontext引用你的应用程序生命周期

相关问题