編輯:Android開發實例
Application的使用
Application和Actovotu,Service一樣是android框架的一個系統組件,當android程序啟動時系統會創建一個 application對象,用來存儲系統的一些信息。通常我們是不需要指定一個Application的,這時系統會自動幫我們創建,如果需要創建自己 的Application,也很簡單創建一個類繼承 Application並在manifest的application標簽中進行注冊(只需要給Application標簽增加個name屬性把自己的 Application的名字定入即可)。
android系統會為每個程序運行時創建一個Application類的對象且僅創建一個,所以Application可以說是單例 (singleton)模式的一個類.且application對象的生命周期是整個程序中最長的,它的生命周期就等於這個程序的生命周期。因為它是全局 的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過Application來進行一些,數據傳遞,數據共享 等,數據緩存等操作。
假如有一個Activity A, 跳轉到 Activity B ,並需要推薦一些數據,通常的作法是Intent.putExtra() 讓Intent攜帶,或者有一個Bundle把信息加入Bundle讓Intent推薦Bundle對象,實現傳遞。但這樣作有一個問題在 於,Intent和Bundle所能攜帶的數據類型都是一些基本的數據類型,如果想實現復雜的數據傳遞就比較麻煩了,通常需要實現 Serializable或者Parcellable接口。這其實是Android的一種IPC數據傳遞的方法。如果我們的兩個Activity在同一個 進程當中為什麼還要這麼麻煩呢,只要把需要傳遞的對象的引用傳遞過去就可以了。
基本思路是這樣的。在Application中創建一個HashMap<String,Object> ,以字符串為索引,Object為value這樣我們的HashMap就可以存儲任何類型的對象了。在Activity A中把需要傳遞的對象放入這個HashMap,然後通過Intent或者其它途經再把這人索引的字符串傳遞給Activity B ,Activity B 就可以根據這個字符串在HashMap中取出這個對象了。只要再向下轉個型 ,就實現了對象的傳遞。
我一般會習慣在application中建立兩個HashMap<String,Object>一個用於數據的傳遞,一個用於緩 存一些數據。比如有一個Activity需要從網站獲取一些數據,獲取完之後我們就可以把這個數據cache到Application 當中,當頁面設置到其它Activity再回來的時候,就可以直接使用緩存好的數據了。但如果需要cache一些大量的數據,最好是cache一些 (軟引用)SoftReference ,並把這些數據cache到本地rom上或者sd卡上。如果在application中的緩存不存在,從本地緩存查找,如果本地緩存的數據也不存在再從網 絡上獲取。
使用Application如果保存了一些不該保存的對象很容易導致內存洩漏。如果在Application的oncreate中執行比較 耗時的操作,將直接影響的程序的啟動時間。不些清理工作不能依靠onTerminate完成,因為android會盡量讓你的程序一直運行,所以很有可能 onTerminate不會被調用。
在Java中內存洩漏是只,某個(某些)對象已經不在被使用應該被gc所回收,但有一個對象持有這個對象的引用而阻止這個對象被回收。比如我 們通常會這樣創建一個View TextView tv = new TextView(this);這裡的this通常都是Activity。所以這個TextView就持有著這個Activity的引用。下面看張圖
通常情況下,當用戶轉動手機的時候,android會重新調用OnCreate()方法生成一個新的Activity,原來的 Activity應該被GC所回收。但如果有個對象比如一個View的作用域超過了這個Activity(比如有一個static對象或者我們把這個 View的引用放到了Application當中),這時候原來的Activity將不能被GC所回收,Activity本身又持有很多對象的引用,所以 整個Activity的內存被洩漏了。
經常導致內存洩漏的一些原因:
keeping a long-lived reference to a Context.持有一個context的對象,從而gc不能回收。
1,一個View,的作用域超出了所在的Activity的作用域,比如一個static的View或者 把一個View cache到了application當中 etc
2,某些與View關聯的Drawable的作用域超出了Activity的作用域。
3,Runnable對象:比如在一個Activity中啟用了一個新線程去執行一個任務,在這期間這個Activity被系統回收了, 但Runnalbe的任務還沒有執行完畢並持有Activity的引用而洩漏,但這種洩漏一般來洩漏一段時間,只有Runnalbe的線程執行完閉,這個 Activity又可以被正常回收了。
4,內存類的對象作用域超出Activity的范圍:比如定義了一個內存類來存儲數據,又把這個內存類的對象傳給了其它Activity 或者Service等。因為內部類的對象會持有當前類的引用,所以也就持有了Context的引用。解決方法是如果不需要當前的引用把內部類寫成 static或者,把內部類抽取出來變成一個單獨的類,或者把避免內部對象作用域超出Activity的作用域。
out Of Memery Error 在android中每一個程序所分到的內存大小是有限的,如果超過了這個數就會報Out Of Memory Error。android給程序分配的內存大小與手機硬件有關,以下是一些手機的數據:
G1:16M Droid:24 Nexus One:32M Xoom:48Ms
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
前面我們已經將每個月的收支明細存入到SQLite的數據表中,本文將實現從SQL
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用