1、Application是什麼?
Application和Activity,Service一樣,是android框架的一個系統組件,當android程序啓動時系統會創建一個application對象
用來存儲系統的一些信息。通常我們是不需要指定一個Application的,這時系統會自動幫我們創建
如果需要創建自己 的Application也很簡單創建一個類繼承 Application並在manifest的application標籤中進行註冊
(只需要給Application標籤增加個name屬性把自己的 Application的名字定入即可)。
Android系統會爲每個程序運行時創建一個Application類的對象且只創建一個、可以理解爲單例模式的一個類。
它的生命週期是整個程序運行中最長的 因爲它是全局的單例,所以在不同的Activity和Service中獲取的都是一個對象。
一般會使用Application來進行一些數據傳遞,數據緩存的操作。
2、Application生命週期
Application中包含了五個公開的方法
1)void onConfigurationChanged(Configuration newConfig)
2)void onCreate()
3)void onLowMemory()
4)void onTerminate()
5)void onTrimMemory()
第一個是在配置被改變時觸發
第二個是在程序創建時創建
第三個內存不夠時觸發
第四個當終止程序時調用 但是不能保證一定調用
第五個是在內存清理時觸發
3、實例展示
/**
* @author ljcheng
* @date 2019/6/29
*/
public class MyApplication extends Application {
private static String TAG = "MyApplication";
@Override
public void onCreate() {
// 程序創建的時候執行
KLog.d(TAG, "onCreate");
super.onCreate();
}
@Override
public void onTerminate() {
// 程序終止的時候執行
//當終止應用程序對象時調用,不保證一定被調用,當程序是被內核終止以便爲其他應用程序釋放資源,那
//麼將不會提醒,並且不調用應用程序的對象的onTerminate方法而直接終止進程
KLog.d(TAG, "onTerminate");
super.onTerminate();
}
@Override
public void onLowMemory() {
// 當後臺程序已經終止資源還匱乏時會調用這個方法。好的應用程序一般會在這個方法裏面釋放一些不必
// 要的資源來應付當後臺程序已經終止,前臺應用程序內存還不夠時的情況。
KLog.d(TAG, "onLowMemory");
super.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
// 程序在內存清理的時候執行
// HOME鍵退出應用程序、長按MENU鍵,打開Recent TASK都會執行
KLog.d(TAG, "onTrimMemory");
super.onTrimMemory(level);
}
@Override
//配置改變時觸發這個方法
public void onConfigurationChanged(Configuration newConfig) {
KLog.d(TAG, "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
}
}
四、總結一下
1.Application的生命週期在整個應用運行期間是最長的
2.具體關於Applicatiom被殺死的情況在上面的代碼已有體現 下面引用下其他人總結的一些情況
備註:application 被殺死的情況分析:
爲了決定在內存較低的時候殺掉哪個進程, Android會根據運行在這些進程內的組件及他們的狀態把進程劃分成一個”重要程度層次”. 其重要的程度按以下規則排序:
1:前端進程可以是一個持有運行在屏幕最前端並與用戶交互的Activity的進程(onResume方法被調用時),也可以是持有一個正在運行的IntentReceiver(也就是說他正在執行自己的onReceiveIntent方法)的進程. 在系統中, 只會有少數這樣的進程, 並且除非內存已經低到不夠這些進程運行, 否則系統不會主動殺掉這些進程. 這時, 設備通常已經達到了需要內存整理的狀態, 所以殺掉這些進程是爲了不讓用戶界面停止響應.
2:可視進程是持有一個被用戶可見, 但沒有顯示在最前端 (onPause方法被調用時) 的Activity的進程. 舉例來說, 這種進程通常出現在一個前端Activity以一個對話框出現並保持前一個Activity可見時. 這種進程被系統認爲是極其重要的, 並且通常不會被殺掉, 除非爲了保持所有前端進程正常運行不得不殺掉這些可見進程.
3:服務進程是持有一個Service的進程, 該Service是由startService()方法啓動的, 儘管這些進程用戶不能直接看到, 但是通常他們做的工作用戶是十分關注的(例如, 在後臺播放mp3或是在後臺下載 上傳文件), 所以, 除非爲了保持所有的前端進程和可視進程正常運行外, 系統是不會殺掉服務進程的.
4:後臺進程是持有一個不再被用戶可見的Activity(onStop()方法被調用時)的進程. 這些進程不會直接影響用戶體驗. 加入這些進程已經完整的,正確的完成了自己的生命週期(訪問Activity查看更多細節), 系統會在爲前三種進程釋放內存時隨時殺掉這些後臺進程. 通常會有很多的後臺進程在運行, 所以這些進程被存放在一個LRU列表中, 以保證在低內存的時候, 最近一個被用戶看到的進程會被最後殺掉
5:空進程是沒有持有任何活動應用組件的進程. 保留這種進程的唯一理由是爲了提供一種緩存機制, 縮短他的應用下次運行時的啓動時間. 就其本身而言, 系統殺掉這些進程的目的是爲了在這些空進程和底層的核心緩存之間平衡整個系統的資源