Android基礎之自訂Application

來源:互聯網
上載者:User

標籤:googl   data-   manifest   files   resource   this   tar   tac   參考   

Application

Android提供了一個Application類,每當應用程式啟動時,系統會自動將這個類進行初始化。在項目中,我們在一些工具類採用了單例模式,其生命週期和整個應用程式相同,並且可能直接或者間接的需要Context引用來進行擷取資源的操作。那麼我們需要一個全域Context也就是Application。

Android基礎之Context文章中我們知道,Application生命週期是整個App

自訂Application用途
  • 為得到一個Application對象提供便捷
  • 封裝一些通用操作
  • 初始化一些全域的變數資料

對於前兩點,Google官方是不建議這樣做的。因為使用一個單例模式同樣可以做到。但是自訂Application沒有任何副作用。而在Application中的onCreate()方法裡去初始化各種全域的變數資料是一種比較推薦的做法。

自訂Application建立一個Application類

建立一個MyApplication並讓它繼承自Application

public class MyApplication extends Application{    private static Context mContext;    @Override    public void onCreate() {        super.onCreate();        mContext = getApplicationContext();    }    public static Context getInstance() {        return mContext;    }}
在AndroidManifest檔案中指定自訂的Application
 <application        android:name=".MyApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme" />

指定完成後,當我們的程式啟動時Android系統就會建立一個MyApplication的執行個體,如果這裡不指定的話就會預設建立一個Application的執行個體。

使用自訂Application注意點初始化資料的時機

我們不能夠在自訂的Application類的構造方法裡初始化一些需要Context引用操作得到的資料,例如getResources()、getPackageName()、getSystemService()等等。一旦這樣做,應用程式已啟動就會報控指標的錯誤。我們應該在onCreate()方法中初始化。

ContextWrapper中有一個attachBaseContext()方法,這個方法會將傳入的一個Context參數賦值給mBase對象,之後mBase對象就有值了。而我們又知道,所有Context的方法都是調用這個mBase對象的同名方法,那麼也就是說如果在mBase對象還沒賦值的情況下就去調用Context中的任何一個方法時,就會出現null 指標異常,(引用自 Android Context完全解析,你所不知道的Context的各種細節)

Application方法執行順序:

盜用大牛郭霖的圖片.png自訂Application採用單例模式

Application全域只有一個,它本身就已經是單例了,無需再用單例模式去為它做多重執行個體保護了。
錯誤示範:

public class MyApplication extends Application {            private static MyApplication app;            public static MyApplication getInstance() {          if (app == null) {              app = new MyApplication();          }          return app;      }        }  

上述代碼的getInstance()方法中,如果app == null,採用new來建立一個新的Application,並將其返回。返回的Application對象不具備Context的能力,只是一個普通的Application執行個體。這和第一個錯誤類似,Application對象應該由Android系統來建立。

正確的操作:

public class MyApplication extends Application {            private static MyApplication app;            public static MyApplication getInstance() {          return app;      }            @Override      public void onCreate() {          super.onCreate();          app = this;      }        }  
參考

Android Context完全解析,你所不知道的Context的各種細節

Android基礎之自訂Application

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.