Application.onCreate()保存Android应用程序的ApplicationContext

时间:2017-02-04 05:54:11

标签: java android memory-leaks

正如标题所示,我怀疑当应用程序启动时调用Application.onCreate()时,我可以将Application实例(当然是单例)保存为静态字段,因此我可以在任何地方获取应用程序上下文我的所有代码,即使我没有活动,片段,视图或其他任何内容。

这似乎很棒,但我也害怕有任何风险吗?

1 个答案:

答案 0 :(得分:0)

为什么不从Application班级获得帮助,

阅读本文> https://developer.android.com/reference/android/app/Application.html

  

用于维护全局应用程序状态的基类。你可以提供   你自己的实现,通过创建一个子类并指定   此子类的完全限定名称为“android:name”属性   在AndroidManifest.xml的标签中。应用程序   class,或Application类的子类,实例化   在您的应用程序/包的进程之前的任何其他类之前   已创建。

     

注意:通常不需要子类Application。多数情况   在这种情况下,静态单例可以提供相同的功能   更模块化的方式。如果你的单身人士需要一个全球背景(为   注册广播接收器的例子),包括   Context.getApplicationContext()作为调用时的Context参数   你的单身人士的getInstance()方法。

您可以通过保持Base类来维护全局应用程序状态来实现这一点,在我的示例中使用Application对象作为单例对象

public class MyApplication extends Application {

    private static MyApplication singleton;

    public static MyApplication getInstance() {
        return singleton;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }



    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }

}

AndroidManifest中指定在应用标记

下使用android:name
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name="MyApplication">

现在您可以在任何地方访问此内容,例如

MyApplication mApplication = (MyApplication)getApplicationContext();