Google不推薦我們使用自定義的Application,基本上只有需要做一些全局初始化的時候才可能需要用到自定義Application。但多數項目只是把自定義Application當成了一個通用工具類,雖然沒什么副作用但使用單例模式實現可能更加優雅。
但是把自定義Application和單例模式混合到一起使用,那就大錯特錯了。一個非常典型的例子如下所示:
public class MyApplication extends Application { private static MyApplication app; public static MyApplication getInstance() { if (app == null) { app = new MyApplication(); } return app; } }
因為我們知道Application是屬於系統組件,系統組件的實例是要由系統來去創建的,如果這里我們自己去new一個MyApplication的實例,它就只是一個普通的Java對象而已,而不具備任何Context的能力。我們只需謹記一點,Application全局只有一個,它本身就已經是單例了,無需再用單例模式去為它做多重實例保護了,正確代碼如下所示:
public class MyApplication extends Application { private static MyApplication app; // getInstance()方法里面不需要任何邏輯判斷,直接返回app對象就可以了 public static MyApplication getInstance() { return app; } @Override public void onCreate() { super.onCreate(); //this就是當前Application的實例,那么app也就是當前Application的實例了 app = this; } }