Android Application詳解


在 Android 中使用全局變量,除 public 靜態變量,還有就是使用 android.app.Application。Android系統 會為每個程序運行時創建一個Application類的對象且僅創建一個,所以Application可以說是單例 (singleton)模式的一個類所以在不同的Activity、Service中獲得的對象都是同一個對象,所以通過 Application來進行一些,數據傳遞,數據共享等,數據緩存等操作。在啟動 Application 時,系統會創建一個 PID,就是 進程ID,所有的 Activity 會在此進程上運行,在創建 Application 時初始化全局變量,同一個應用的所有 Activity 都會獲取這些全局變量的值,可用於保存登錄狀態。Application中的全局變量值會在 Activity中被改變,其生命周期等於整個程序的生命周期

注:1> 在 Application 類中,其onCreate()方法,是Android應用程序真正的入口,將會會在所有 Activity,Service,Receiver組件之前調用
       2> 在Android中,可以通過繼承Application類來實現應用程序級的全局變量,這種全局變量方法相對靜態類更有保障,直到應用的所有Activity全部被destory掉之后才會被釋放掉
       3> 在組件之間傳遞信息:在自定義的 Application中設置成員變量這樣在Activity、Service、Fragment等之間通過獲取Application實例來訪問其中成員變量
       4> 如果需要 cache一些大量的數據,最好是cache一些 (軟引用)SoftReference ,並把這些數據cache到本地rom上或者sd卡上。如果在 Application中的緩存不存在,從本地緩存查找,如果本地緩存的數據也不存在,再從網絡上獲取
       5> 使用Application如果保存了一些不該保存的對象很容易導致內存泄漏。如果在Application的oncreate中執行比較 耗時的操作,將直接影響的程序的啟動時間。一些清理工作不能依靠 onTerminate 完成,因為 Android會盡量讓程序一直運行,所以很有可能 onTerminate不會被調用
 
使用方式
(1)在AndroidManifest.xml中在<application>標簽中添加android:name="...",其中設置 Applicationl類的
如:
<application
android:name=".CombankDroid"
android:icon="@drawable/first_aid"
android:label="@string/app_name" >
...
</application>
 
(2)創建 Application 類,該類繼承於 android.app.Application
如:
publicclass CombankDroid extends Application {
privateboolean isLogin;
publicboolean isLogin(){
return isLogin
}
 
publicvoid setIsLogin(boolean b){
    isLogin
    isLogin = b;
}
}
 

(3)在Activity中使用,通過 Application 類實例,再通過該類中的方法獲取相關數據

獲取 在Service 和 Activity 中獲取 Application 的三種方法:
        1>  getApplication() : 如 CombankDroid combankDroid = ((CombankDroid)getApplication())
        2>  getApplicationContext() : 如 CombankDroid combankDroid = ((CombankDroid)getApplicationContext())
        3>  getApplicationInstance() : 如 CombankDroid combankDroid = CombankDroid.getApplicationInstance()
            注:getApplicationInstance()用在獲取不到context對象的類中
        4> 將要操作的屬性設為靜態方法就可以直接調用 如:MyApplication.info.getUserName()
如:
class Anyhow extends Activity {
@Override
publicvoid onCreate(Bundle b){
...
CombankDroid combankDroid = ((CombankDroid)getApplicationContext());
if (!combankDroid.isLogin()) {
redirectToLoginActivity();
} else {
loadUi();
}
...
}
...
}
 
 
Application中存儲數據存在的問題
由於Application 對象不會一直呆着內存里面,它會被kill掉,比如啟動 App后將數據存儲在Application中點擊 Home 鍵離開App幾小時后,再返回App,此時實際上App不會重新啟動,Android 系統會創建一個新的Application對象,然后再啟動上次用戶離開時的Activity以此造成App從來沒有被Kill掉的假象,此時在獲取Appication中的數據將會出現異常。針對這種問題,可根據情況采用其它的方式:
    1> 直接將數據通過intent傳遞給 Activity
    2> 使用官方推薦的幾種方式將數據持久化到磁盤上
    3> 在使用Application中的數據時,總是要對變量的值進行非空檢查
注:對 Application對象有用,對你app里面的單例對象(singleton)或者公共靜態變量(public static)同樣適用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM