轉載自:https://juejin.im/post/5a5413f4f265da3e497fe8b9android
請你們去原做者那裏點贊,我這裏僅僅是轉載而已,供本身記錄。支持原做者的原創。緩存
Applicaiton
類在 Android
開發中很是常見,但是你真的瞭解Applicaiton
類嗎?Applicaiton
類,包括特色、方法介紹、應用場景和具體使用,但願大家會喜歡。Android App
)的類,也屬於Android
中的一個系統組件ContextWarpper
類Android App
運行時,會首先自動建立Application
類並實例化 Application
對象,且只有一個即
Application
類 是單例模式(singleton
)類bash
Application
類自定義Application
類和實例即不一樣的組件(如Activity、Service
)均可得到Application
對象且都是同一個對象網絡
Application
對象的生命週期是整個程序中最長的,即等於Android App
的生命週期app
那麼,該 Application
類有什麼做用呢?下面,我將介紹Application
類的方法使用ide
Application
實例建立時調用
Android
系統的入口是Application
類的onCreate()
,默認爲空實現post
注:請不要執行耗時操做,不然會拖慢應用程序啓動速度性能
注:這些共享數據只在應用程序的生命週期內有效,當該應用程序被殺死,這些數據也會被清空,因此只能存儲一些具有 臨時性的共享數據測試
// 複寫方法須要在Application子類裏實現
private static final String VALUE = "Carson";
// 初始化全局變量
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
複製代碼
ComponentCallbacks2
回調接口本質上是複寫
ComponentCallbacks2
回調接口裏的方法從而實現更多的操做,具體下面會詳細介紹優化
registerComponentCallbacks(new ComponentCallbacks2() {
// 接口裏方法下面會繼續介紹
@Override
public void onTrimMemory(int level) {
}
@Override
public void onLowMemory() {
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
}
});
複製代碼
Android 4.0
後提供的一個API
- 系統在內存不足時會按照
LRU Cache
中從低到高殺死進程;優先殺死佔用內存較高的應用- 若應用佔用內存較小 = 被殺死概率下降,從而快速啓動(即熱啓動 = 啓動速度快)
- 可回收的資源包括: a. 緩存,如文件緩存,圖片緩存 b. 動態生成 & 添加的View
典型的應用場景有兩個:
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onTrimMemory(int level) {
// Android系統會根據當前內存使用的狀況,傳入對應的級別
// 下面以清除緩存爲例子介紹
super.onTrimMemory(level);
. if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
mPendingRequests.clear();
mBitmapHolderCache.evictAll();
mBitmapCache.evictAll();
}
});
複製代碼
Application.onTrimMemory()
Activity.onTrimMemory()
Fragment.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
複製代碼
特別注意:onTrimMemory()
中的TRIM_MEMORY_UI_HIDDEN
與onStop()
的關係
onTrimMemory()
中的TRIM_MEMORY_UI_HIDDEN
的回調時刻:當應用程序中的全部UI組件所有不可見時Activity
的onStop()
回調時刻:當一個Activity徹底不可見的時候onStop()中
釋放與 Activity
相關的資源,如取消網絡鏈接或者註銷廣播接收器等onTrimMemory()
中的TRIM_MEMORY_UI_HIDDEN
中釋放與UI
相關的資源,從而保證用戶在使用應用程序過程當中,UI
相關的資源不須要從新加載,從而提高響應速度注:
onTrimMemory
的TRIM_MEMORY_UI_HIDDEN
等級是在onStop()
方法以前調用
的
Android
系統總體內存較低時刻Android
系統總體內存較低時registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onLowMemory() {
}
});
複製代碼
Android 4.0
前 檢測內存使用狀況,從而避免被系統直接殺掉 & 優化應用程序的性能體驗相似於
OnTrimMemory()
OnTrimMemory()
& OnLowMemory()
關係
OnTrimMemory()
是 OnLowMemory()
Android 4.0
後的替代 API
OnLowMemory()
= OnTrimMemory()
中的TRIM_MEMORY_COMPLETE
級別Android 4.0
前,請使用OnLowMemory()
;不然直接使用OnTrimMemory()
便可registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
...
}
});
複製代碼
Manifest.xml
文件下的 Activity
標籤屬性android:configChanges
的值,以下:<activity android:name=".MainActivity">
android:configChanges="keyboardHidden|orientation|screenSize"
// 設置該配置屬性會使 Activity在配置改變時不重啓,只執行onConfigurationChanged()
// 上述語句代表,設置該配置屬性可以使 Activity 在屏幕旋轉時不重啓
</activity>
複製代碼
Activity
的生命週期監聽Activity
生命週期發生變化時就會調用其實是調用
registerActivityLifecycleCallbacks()
裏ActivityLifecycleCallbacks
接口裏的方法
// 實際上須要複寫的是ActivityLifecycleCallbacks接口裏的方法
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
Log.d(TAG,"onActivityCreated: " + activity.getLocalClassName());
}
@Override
public void onActivityStarted(Activity activity) {
Log.d(TAG,"onActivityStarted: " + activity.getLocalClassName());
}
@Override
public void onActivityResumed(Activity activity) {
Log.d(TAG,"onActivityResumed: " + activity.getLocalClassName());
}
@Override
public void onActivityPaused(Activity activity) {
Log.d(TAG,"onActivityPaused: " + activity.getLocalClassName());
}
@Override
public void onActivityStopped(Activity activity) {
Log.d(TAG, "onActivityStopped: " + activity.getLocalClassName());
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
Log.d(TAG,"onActivityDestroyed: " + activity.getLocalClassName());
}
});
<-- 測試:把應用程序從前臺切到後臺再打開,看Activcity的變化 -->
onActivityPaused: MainActivity
onActivityStopped: MainActivity
onActivityStarted: MainActivity
onActivityResumed: MainActivity
複製代碼
調用時刻:應用程序結束時調用
但該方法只用於
Android
仿真機測試,在Android
產品機是不會調用的
從Applicaiton
類的方法能夠看出,Applicaiton
類的應用場景有:(已按優先級排序)
Application
類即繼承 Application
類
public class CarsonApplication extends Application
{
...
// 根據自身需求,並結合上述介紹的方法進行方法複寫實現
// 下面以onCreate()爲例
private static final String VALUE = "Carson";
// 初始化全局變量
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
複製代碼
在Manifest.xml
文件中 <application>
標籤裏進行配置
<application
android:name=".CarsonApplication"
// 此處自定義Application子類的名字 = CarsonApplication
</application>
複製代碼
private CarsonApplicaiton app;
// 只須要調用Activity.getApplication() 或Context.getApplicationContext()就能夠得到一個Application對象
app = (CarsonApplication) getApplication();
// 而後再獲得相應的成員變量 或方法 便可
app.exitApp();
複製代碼
至此,關於 Applicaiton
類已經講解完畢。