標籤: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