Andriod studio 學習 之 Application的生命週期和上下文的應用場景

Application的生命週期和上下文的應用場景

Application是什麼?

Application和Activity,Service一樣,是Android框架的一個系統組件,當Android程序啓動時系統會創建一Application 對象,用來存儲系統的一些信息。

通常我們是不需要指定一個Application的,這時系統會自動幫我們創建,如果需要創建自己的Application,也很簡單。
創建一個類AppApplication繼承Application並在AndroidManifest的application標籤中進行註冊(只需要給application 標籤增加個name屬性把自己的Application的名字寫入即可)。

Android系統會爲每個程序運行時創建一個Application類的對象且僅創建一個
(打開微信安卓系統會爲微信創建一個Application對象,再打開微博安卓系統又會爲微博創建一個Application對象),
所以Application可以說是單例 (singleton)模式的一個類.
且Application對象的生命週期是整個程序中最長的,它的生命週期就等於這個程序的生命週期。因爲它是全局的單例 的,所以在不同的Activity,Service中獲得的Application對象都是同一個對象。
所以可以通過Application來進行一些,數據傳遞,數據共享,數據緩存等操作

Application的應用
通過Application傳遞數據

假如有一個Activity A, 跳轉到 Activity B ,並需要傳遞一些數據,通常的作法是Intent.putExtra()讓Intent攜帶,或者有 一個Bundle把信息加入Bundle讓Intent推薦Bundle對象,實現傳遞。但這樣作有一個問題在於,Intent和Bundle所能攜 帶的數據類型都是一些基本的數據類型,如果想實現複雜的數據傳遞就比較麻煩了,通常需要實現Serializable或者
Parcellable接口。這其實是Android的一種IPC數據傳遞的方法。如果我們的兩個Activity在同一個進程當中爲什麼還要
這麼麻煩呢,只要把需要傳遞的對象的引用傳遞過去就可以了。

基本思路是這樣的。在Application中創建一個HashMap ,以字符串爲索引,Object爲value這樣我們的HashMap就可 以存儲任何類型的對象了。
在Activity A中把需要傳遞的對象放入這個HashMap,然後通過Intent或者其它途經再把這索引的字符串傳遞給Activity B ,Activity B 就可以根據這個字符串在HashMap中取出這個對象了。只要再向下轉個型 ,就實現對象的傳遞。

Application數據共享

多個組件之間數據共享。舉例:兩個Activity之間數據共享
Application 對同一個應用程序是唯一的,所以可以使用Application進行數據共享。

Application數據緩存

我一般會習慣在Application中建立兩個HashMap一個用於數據的傳遞,一個用於緩存一些數據。
比如有一個Activity需要從網站獲取一些數據,獲取完之後我們就可以把這個數據cache到Application當中,
當頁面設置到其它Activity再回來的時候,就可以直接使用緩存好的數據了。但如果需要cache一些大量的數據,
最好是cache一些 (軟引用)SoftReference ,並把這些數據cache到本地rom上或者sd卡上。
如果在application中的緩存不存在,從本地緩存查找,如果本地緩存的數據也不存在再從網絡上獲取。

易導致的錯誤

使用Application如果保存了一些不該保存的對象很容易導致內存泄漏。
如果在Application的onCreate中執行比較耗時的操作,將直接影響程序的啓動時間。
一些清理工作不能依靠onTerminate完成,因爲android會盡量讓你的程序一直運行,所以很有可能onTerminate()方法 不會被調用。

Application的生命週期

1、onCreate() 程序創建的時候執行

2、onTerminate() 程序終止的時候執行
在模擬環境下執行。當終止應用程序對象時調用,不保證一定被調用,
當程序是被內核終止以便爲其他應用程序釋放資源,那麼將不會提醒,
並且不調用應用程序Application對象的onTerminate方法而直接終止進程。

3、onLowMemory() 低內存的時候執行

好的應用程序一般會在這個方法裏面釋放一些不必要的資源來應付當後臺程序已經終止,
前臺應用程序內存還不夠時的情況。

4、onConfigurationChanged(Configuration newConfig) 配置改變時觸發這個方法。

5、onTrimMemory(int level)程序在進行內存清理時執行

生命週期演示
package com.example.apptext;

import android.app.Application;
import android.content.res.Configuration;
import android.util.Log;

public class MyApp extends Application {
    private static final String TAG = "MyApp";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate: ");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, "onConfigurationChanged: ");
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.i(TAG, "onLowMemory: ");
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        Log.i(TAG, "onTerminate: ");
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        Log.i(TAG, "onTrimMemory: ");
    }
}

記得在清單文件中配置

android:name=".MyApp"

保活進階

application 被殺死的情況分析:
爲了決定在內存較低的時候殺掉哪個進程, Android會根據運行在這些進程內的組件及他們的狀態把進程劃分成一個”重 要程度層次”.
其重要的程度按以下規則排序:
1、前端進程可以是一個持有運行在屏幕最前端並與用戶交互的Activity的進程(onResume方法被調用時),
也可以是持有一個正在運行的IntentReceiver(也就是說他正在執行自己的onReceiveIntent方法)的進程.
在系統中, 只會有少數這樣的進程, 並且除非內存已經低到不夠這些進程運行, 否則系統不會主動殺掉這些進程.
這時, 設備通常已經達到了需要內存整理的狀態, 所以殺掉這些進程是爲了不讓用戶界面停止響應.

2、可視進程是持有一個被用戶可見, 但沒有顯示在最前端 (onPause方法被調用時) 的Activity的進程.
舉例來說, 這種進程通常出現在一個前端Activity以一個對話框出現並保持前一個Activity可見時.
這種進程被系統認爲是極其重要的, 並且通常不會被殺掉, 除非爲了保持所有前端進程正常運行不得不殺掉這些 可見進程.
3、服務進程是持有一個Service的進程, 該Service是由startService()方法啓動的, 儘管這些進程用戶不能直接看到,
但是通常他們做的工作用戶是十分關注的(例如, 在後臺播放mp3或是在後臺下載上傳文件), 所以, 除非爲了保 持所有的前端進程和可視進程正常運行外,系統是不會殺掉服務進程的.
4、後臺進程是持有一個不再被用戶可見的Activity(onStop()方法被調用時)的進程. 這些進程不會直接影響用戶體驗. 加入這些進程已經完整的,正確的完成了自己的生命週期(訪問Activity查看更多細節), 系統會在爲前三種進程釋 放內存時隨時殺掉這些後臺進程. 通常會有很多的後臺進程在運行, 所以這些進程被存放在一個LRU列表中, 以 保證在低內存的時候, 最近 一個被用戶看到的進程會被最後殺掉.
5、空進程是沒有持有任何活動應用組件的進程. 保留這種進程的唯一理由是爲了提供一種緩存機制, 縮短他的應用下 次運行時的啓動時間. 就其本身而言, 系統殺掉這些進程的目的是爲了在這些空進程和底層的核心緩存之間平衡 整個系統的資源.

利用 Activity 提升權限

https://www.jianshu.com/p/4ff700faab78

利用 Notification 提升權限

參看我們用服務發廣播的例子

利用系統廣播拉活

參照廣播的例子

利用第三方應用廣播拉活

以後說

利用系統Service機制拉活

即service中onStartCommand方法設置flags =
START_STICKY;或者onDestroy中重新啓動service。

利用 JobScheduler 機制拉活

https://blog.csdn.net/qq_33689414/article/details/54668889

利用賬號同步機制拉活

阿里系,百度系,騰訊系.(手機變慢了…)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章