文檔當前狀態:**alpha0.1**
* [x] 選題收集:2018/01/09
* [ ] 初稿整理:
* [ ] 補充校對:
* [ ] 入庫存檔:
---
參考源:
[Android:手把手帶你 使用 熟悉而陌生的Application類](https://juejin.im/post/5a5413f4f265da3e497fe8b9)
---
# 前言
* `Applicaiton`類在 `Android`開發中非常常見,可是你真的了解`Applicaiton`類嗎?
* 本文將全面解析`Applicaiton`類,包括特點、方法介紹、應用場景和具體使用,希望你們會喜歡。
* * *
# 目錄

* * *
# 1\. 定義
* 代表應用程序(即 `Android App`)的類,也屬于`Android`中的一個系統組件
* 繼承關系:繼承自 `ContextWarpper` 類

* * *
# 2\. 特點
### 2.1 實例創建方式:單例模式
* 每個`Android App`運行時,會首先自動創建`Application` 類并實例化 `Application` 對象,且只有一個
> 即 `Application`類 是單例模式(`singleton`)類
* 也可通過 繼承 `Application` 類自定義`Application` 類和實例
### 2.2 實例形式:全局實例
即不同的組件(如`Activity、Service`)都可獲得`Application`對象且都是同一個對象
### 2.3 生命周期:等于 Android App 的生命周期
`Application` 對象的生命周期是整個程序中最長的,即等于`Android App`的生命周期
* * *
# 3\. 方法介紹
那么,該 `Application` 類有什么作用呢?下面,我將介紹`Application` 類的方法使用

### 3.1 onCreate()
* 調用時刻: `Application` 實例創建時調用
> `Android`系統的入口是`Application`類的 `onCreate()`,默認為空實現
* 作用
1. 初始化 應用程序級別 的資源,如全局對象、環境配置變量、圖片資源初始化、推送服務的注冊等
> 注:請不要執行耗時操作,否則會拖慢應用程序啟動速度
1. 數據共享、數據緩存 設置全局共享數據,如全局共享變量、方法等
> 注:這些共享數據只在應用程序的生命周期內有效,當該應用程序被殺死,這些數據也會被清空,所以只能存儲一些具備 **臨時性的共享數據**
* 具體使用
~~~
// 復寫方法需要在Application子類里實現
private static final String VALUE = "Carson";
// 初始化全局變量
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
~~~
### 3.2 registerComponentCallbacks() & unregisterComponentCallbacks()
* 作用:注冊和注銷 `ComponentCallbacks2`回調接口
> 本質上是復寫 `ComponentCallbacks2`回調接口里的方法從而實現更多的操作,具體下面會詳細介紹
* 具體使用
~~~
registerComponentCallbacks(new ComponentCallbacks2() {
// 接口里方法下面會繼續介紹
@Override
public void onTrimMemory(int level) {
}
@Override
public void onLowMemory() {
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
}
});
~~~
### 3.3 onTrimMemory()
* 作用:通知 應用程序 當前內存使用情況(以內存級別進行識別)
> `Android 4.0` 后提供的一個API

* 應用場景:根據當前內存使用情況進行自身的內存資源的不同程度釋放,以避免被系統直接殺掉 & 優化應用程序的性能體驗
> 1. 系統在內存不足時會按照`LRU Cache`中從低到高殺死進程;優先殺死占用內存較高的應用
> 2. 若應用占用內存較小 = 被殺死幾率降低,從而快速啟動(即熱啟動 = 啟動速度快)
> 3. 可回收的資源包括: 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完全不可見的時候
* 使用建議:
1. 在 `onStop()中`釋放與 `Activity`相關的資源,如取消網絡連接或者注銷廣播接收器等
2. 在`onTrimMemory()`中的`TRIM_MEMORY_UI_HIDDEN`中釋放與`UI`相關的資源,從而保證用戶在使用應用程序過程中,`UI`相關的資源不需要重新加載,從而提升響應速度
> 注:`onTrimMemory`的`TRIM_MEMORY_UI_HIDDEN`等級是在`onStop()`方法之前`調用`的
### 3.4 onLowMemory()
* 作用:監聽 `Android`系統整體內存較低時刻
* 調用時刻:`Android`系統整體內存較低時
~~~
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onLowMemory() {
}
});
~~~
* 應用場景:`Android 4.0`前 檢測內存使用情況,從而避免被系統直接殺掉 & 優化應用程序的性能體驗
> 類似于 `OnTrimMemory()`
* 特別注意:`OnTrimMemory()` & `OnLowMemory()` 關系
1. `OnTrimMemory()`是 `OnLowMemory()` `Android 4.0`后的替代 `API`
2. `OnLowMemory()` = `OnTrimMemory()`中的`TRIM_MEMORY_COMPLETE`級別
3. 若想兼容`Android 4.0`前,請使用`OnLowMemory()`;否則直接使用`OnTrimMemory()`即可
### 3.5 onConfigurationChanged()
* 作用:監聽 應用程序 配置信息的改變,如屏幕旋轉等
* 調用時刻:應用程序配置信息 改變時調用
* 具體使用
~~~
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>
~~~
### 3.6 registerActivityLifecycleCallbacks() & unregisterActivityLifecycleCallbacks()
* 作用:注冊 / 注銷對 應用程序內 所有`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
~~~
### 3.7 onTerminate()
調用時刻:應用程序結束時調用
> 但該方法只用于`Android`仿真機測試,在`Android`產品機是不會調用的
* * *
# 4\. 應用場景
從`Applicaiton`類的方法可以看出,`Applicaiton`類的應用場景有:(已按優先級排序)
* 初始化 應用程序級別 的資源,如全局對象、環境配置變量等
* 數據共享、數據緩存,如設置全局共享變量、方法等
* 獲取應用程序當前的內存使用情況,及時釋放資源,從而避免被系統殺死
* 監聽 應用程序 配置信息的改變,如屏幕旋轉等
* 監聽應用程序內 所有Activity的生命周期
* * *
# 5\. 具體使用
* 若需要復寫實現上述方法,則需要自定義 `Application`類
* 具體過程如下
### 步驟1:新建Application子類
即繼承 `Application` 類
~~~
public class CarsonApplication extends Application
{
...
// 根據自身需求,并結合上述介紹的方法進行方法復寫實現
// 下面以onCreate()為例
private static final String VALUE = "Carson";
// 初始化全局變量
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
~~~
### 步驟2:配置自定義的Application子類
在`Manifest.xml`文件中 `<application>`標簽里進行配置
*Manifest.xml*
~~~
<application
android:name=".CarsonApplication"
// 此處自定義Application子類的名字 = CarsonApplication
</application>
~~~
### 步驟3:使用自定義的Application類實例
~~~
private CarsonApplicaiton app;
// 只需要調用Activity.getApplication() 或Context.getApplicationContext()就可以獲得一個Application對象
app = (CarsonApplication) getApplication();
// 然后再得到相應的成員變量 或方法 即可
app.exitApp();
~~~
至此,關于 `Applicaiton` 類已經講解完畢。
* * *
# 6\. 總結
* 我用一張圖總結上述文章

* 下面我將繼續對 `Android`中的知識進行深入講解 ,有興趣可以繼續關注[Carson_Ho的安卓開發筆記](https://link.juejin.im?target=https%3A%2F%2Fjuejin.im%2Fuser%2F58d4d9781b69e6006ba65edc)
* * *
# 請點贊!因為你的鼓勵是我寫作的最大動力!
- 0-發現
- AndroidInterview-Q-A
- Android能讓你少走彎路的干貨整理
- LearningNotes
- temp
- temp11
- 部分地址
- 0-待辦任務
- 待補充列表
- 0-未分類
- AndroidView事件分發與滑動沖突處理
- Spannable
- 事件分發機制詳解
- 1-Java
- 1-Java-01基礎
- 未歸檔
- 你應該知道的JDK知識
- 集合框架
- 1-Java-04合集
- Java之旅0
- Java之旅
- JAVA之旅01
- JAVA之旅02
- JAVA之旅03
- JAVA之旅04
- JAVA之旅05
- JAVA之旅06
- JAVA之旅07
- JAVA之旅08
- JAVA之旅09
- java之旅1
- JAVA之旅10
- JAVA之旅11
- JAVA之旅12
- JAVA之旅13
- JAVA之旅14
- JAVA之旅15
- JAVA之旅16
- JAVA之旅17
- JAVA之旅18
- JAVA之旅19
- java之旅2
- JAVA之旅20
- JAVA之旅21
- JAVA之旅22
- JAVA之旅23
- JAVA之旅24
- JAVA之旅25
- JAVA之旅26
- JAVA之旅27
- JAVA之旅28
- JAVA之旅29
- java之旅3
- JAVA之旅30
- JAVA之旅31
- JAVA之旅32
- JAVA之旅33
- JAVA之旅34
- JAVA之旅35
- 1-Java-05辨析
- HashMapArrayMap
- Java8新特性
- Java8接口默認方法
- 圖解HashMap(1)
- 圖解HashMap(2)
- 2-Android
- 2-Android-1-基礎
- View繪制流程
- 事件分發
- AndroidView的事件分發機制和滑動沖突解決
- 自定義View基礎
- 1-安卓自定義View基礎-坐標系
- 2-安卓自定義View基礎-角度弧度
- 3-安卓自定義View基礎-顏色
- 自定義View進階
- 1-安卓自定義View進階-分類和流程
- 10-安卓自定義View進階-Matrix詳解
- 11-安卓自定義View進階-MatrixCamera
- 12-安卓自定義View進階-事件分發機制原理
- 13-安卓自定義View進階-事件分發機制詳解
- 14-安卓自定義View進階-MotionEvent詳解
- 15-安卓自定義View進階-特殊形狀控件事件處理方案
- 16-安卓自定義View進階-多點觸控詳解
- 17-安卓自定義View進階-手勢檢測GestureDetector
- 2-安卓自定義View進階-繪制基本圖形
- 3-安卓自定義View進階-畫布操作
- 4-安卓自定義View進階-圖片文字
- 5-安卓自定義View進階-Path基本操作
- 6-安卓自定義View進階-貝塞爾曲線
- 7-安卓自定義View進階-Path完結篇偽
- 8-安卓自定義View進階-Path玩出花樣PathMeasure
- 9-安卓自定義View進階-Matrix原理
- 通用類介紹
- Application
- 2-Android-2-使用
- 2-Android-02控件
- ViewGroup
- ConstraintLayout
- CoordinatorLayout
- 2-Android-03三方使用
- Dagger2
- Dagger2圖文完全教程
- Dagger2最清晰的使用教程
- Dagger2讓你愛不釋手-終結篇
- Dagger2讓你愛不釋手-重點概念講解、融合篇
- dagger2讓你愛不釋手:基礎依賴注入框架篇
- 閱讀筆記
- Glide
- Google推薦的圖片加載庫Glide:最新版使用指南(含新特性)
- rxjava
- 這可能是最好的RxJava2.x入門教程完結版
- 這可能是最好的RxJava2.x入門教程(一)
- 這可能是最好的RxJava2.x入門教程(三)
- 這可能是最好的RxJava2.x入門教程(二)
- 這可能是最好的RxJava2.x入門教程(五)
- 這可能是最好的RxJava2.x入門教程(四)
- 2-Android-3-優化
- 優化概況
- 各種優化
- Android端秒開優化
- apk大小優化
- 內存分析
- 混淆
- 2-Android-4-工具
- adb命令
- 一鍵分析Android的BugReport
- 版本控制
- git
- git章節簡述
- 2-Android-5-源碼
- HandlerThread 源碼分析
- IntentService的使用和源碼分析
- 2-Android-9-辨析
- LRU算法
- 什么是Bitmap
- 常見圖片壓縮方式
- 3-Kotlin
- Kotlin使用筆記1-草稿
- Kotlin使用筆記2
- kotlin特性草稿
- Kotlin草稿-Delegation
- Kotlin草稿-Field
- Kotlin草稿-object
- 4-JavaScript
- 5-Python
- 6-Other
- Git
- Gradle
- Android中ProGuard配置和總結
- gradle使用筆記
- Nexus私服搭建
- 編譯提速最佳實踐
- 7-設計模式與架構
- 組件化
- 組件化探索(OKR)
- 1-參考列表
- 2-1-組件化概述
- 2-2-gradle配置
- 2-3-代碼編寫
- 2-4-常見問題
- 2-9-值得一讀
- 8-數據結構與算法
- 0臨時文件
- 漢諾塔
- 8-數據-1數據結構
- HashMap
- HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比較
- 遲到一年HashMap解讀
- 8-數據-2算法
- 1個就夠了
- Java常用排序算法(必須掌握的8大排序算法)
- 常用排序算法總結(性能+代碼)
- 必須知道的八大種排序算法(java實現)
- 9-職業
- 閱讀
- 書單
- 面試
- 面試-01-java
- Java面試題全集駱昊(上)
- Java面試題全集駱昊(下)
- Java面試題全集駱昊(中)
- 面試-02-android
- 40道Android面試題
- 面試-03-開源源碼
- Android圖片加載框架最全解析(二),從源碼的角度理解Glide的執行流程
- 面試-07-設計模式
- 面試-08-算法
- 面試-09-其他
- SUMMARY
- 版權說明
- temp111