日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android使用Application总结

發布時間:2025/7/14 Android 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android使用Application总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于application的使用,一般是

在Android源碼中對他的描述是;

?????? ?* Base class for those who need to maintain global application state. You can
????? ? * provide your own implementation by specifying its name in your
? ? ? ? * AndroidManifest.xml's <application> tag, which will cause that class
? ? ? ? * to be instantiated for you when the process for your application/package is
??????? * created.

? ? ?SDK中的描述:Application類是為了那些需要保存全局變量設計的基本類,你可以在AndroidManifest.xml的<application>標簽中進行自己的實現,這樣的結果是:當你的 ? ? ?application或者包被建立的時候將引起那個類被建立。
? ? ?理解:就是說application是用來保存全局變量的,并且是在package創建的時候就跟著存在了。所以當我們需要創建全局變量的時候,不需要再像j2se那樣需要創建public權限的static變量,而直接在application中去實現。只需要調用Context的getApplicationContext或者Activity的getApplication方法來獲得一個application對象,再做出相應的處理。

Android程序的入口點

Android使用Google?Dalvik?VM,相對于傳統Java?VM而言有著很大的不同,在Sun的Java體系中入口點和標準c語言一樣是main(),而每個Android程序都包含著一個Application實例,一個Application實例中有多個Activity、Service、ContentProvider或Broadcast?Receiver。因為大部分的應用都包含Activity所以,說很多網友認為是Activity的onCreate,但是你沒有發現你的工程中有多個Activity嗎??你可能沒有見過沒有Activity的Android應用吧。

其實在android.app.Application這個包的onCreate才是真正的Android入口點,只不過大多數開發者無需重寫該類,他的繼承關系如下圖:

java.lang.Object
??android.content.Context
??android.content.ContextWrapper
??android.app.Application

android.app.Application類包含了4個公開的方法

void??onConfigurationChanged(Configuration?newConfig)
void??onCreate()??//這里才是真正的入口點。
void??onLowMemory()
void??onTerminate()

所以希望大家,記住真正的Android入口點是application的main,你可以看下androidmanifest.xml的包含關系就清楚了,并不是每個應用都必須有Activity的。

1:Application是什么?

1 Application和Activity,Service一樣,是android框架的一個系統組件,當android程序啟動時系統會創建一個 application對象,用來存儲系統的一些信息。
通常我們是不需要指定一個Application的,這時系統會自動幫我們創建,如果需要創建自己 的Application,也很簡單創建一個類繼承 Application并在manifest的
application標簽中進行注冊(只需要給Application標簽增加個name屬性把自己的 Application的名字定入即可)。

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

2:通過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中取出這個對象了。只要再向下轉個型 ,就實現了對象的傳遞。

3:Application數據緩存

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

4:PitFalls(漢語:易犯的錯誤)

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

5:MemoryLeak

在Java中內存泄漏是只,某個(某些)對象已經不在被使用應該被gc所回收,但有一個對象持有這個對象的引用而阻止這個對象被回收。比如我 們通常會這樣創建一個View TextView tv = new TextView(this);這里的this通常都是Activity。所以這個TextView就持有著這個Activity的引用。下面看張圖 (Google IO 2011 ppt中抄得)
通常情況下,當用戶轉動手機的時候,android會重新調用OnCreate()方法生成一個新的Activity,原來的 Activity應該被GC所回收。但如果有個對象比如一個View的作用域超過了這個Activity(比如有一個static對象或者我們把這個 View的引用放到了Application當中),這時候原來的Activity將不能被GC所回收,Activity本身又持有很多對象的引用,所以 整個Activity的內存被泄漏了。

1 2 3 備注:經常導致內存泄漏核心原因: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
所以盡量把程序中的一些大的數據cache到本地文件。以免內存使用量超標。
記得數據傳遞完成之后,把存放在application的HashMap中的數據remove掉,以免發生內存的泄漏

6:生命周期:

  onCreate 在創建應用程序時創建
    onTerminate 當終止應用程序對象時調用,不保證一定被調用,當程序是被內核終止以便為其他應用程序釋放資源,那
  么將不會提醒,并且不調用應用程序的對象的onTerminate方法而直接終止進 程
  onLowMemory 當后臺程序已經終止資源還匱乏時會調用這個方法。好的應用程序一般會在這個方法里面釋放一些不必
  要的資源來應付當后臺程序已經終止,前臺應用程序內存還不夠時的情況。
  onConfigurationChanged 配置改變時觸發這個方法

  備注:application 被殺死的情況分析:
為了決定在內存較低的時候殺掉哪個進程, Android會根據運行在這些進程內的組件及他們的狀態把進程劃分成一個”重要程度層次”. 其重要的程度按以下規則排序:
  1:前端進程可以是一個持有運行在屏幕最前端并與用戶交互的Activity的進程(onResume方法被調用時),也可以是持有一個正在運行的IntentReceiver(也就是說他正在執行自己的onReceiveIntent方法)的進程. 在系統中, 只會有少數這樣的進程, 并且除非內存已經低到不夠這些進程運行, 否則系統不會主動殺掉這些進程. 這時, 設備通常已經達到了需要內存整理的狀態, 所以殺掉這些進程是為了不讓用戶界面停止響應.
  2:可視進程是持有一個被用戶可見, 但沒有顯示在最前端 (onPause方法被調用時) 的Activity的進程. 舉例來說, 這種進程通常出現在一個前端Activity以一個對話框出現并保持前一個Activity可見時. 這種進程被系統認為是極其重要的, 并且通常不會被殺掉, 除非為了保持所有前端進程正常運行不得不殺掉這些可見進程.
  3:服務進程是持有一個Service的進程, 該Service是由startService()方法啟動的, 盡管這些進程用戶不能直接看到, 但是通常他們做的工作用戶是十分關注的(例如, 在后臺播放mp3或是在后臺下載 上傳文件), 所以, 除非為了保持所有的前端進程和可視進程正常運行外, 系統是不會殺掉服務進程的.
  4:后臺進程是持有一個不再被用戶可見的Activity(onStop()方法被調用時)的進程. 這些進程不會直接影響用戶體驗. 加入這些進程已經完整的,正確的完成了自己的生命周期(訪問Activity查看更多細節), 系統會在為前三種進程釋放內存時隨時殺掉這些后臺進程. 通常會有很多的后臺進程在運行, 所以這些進程被存放在一個LRU列表中, 以保證在低內存的時候, 最近一個被用戶看到的進程會被最后殺掉.
  5:空進程是沒有持有任何活動應用組件的進程. 保留這種進程的唯一理由是為了提供一種緩存機制, 縮短他的應用下次運行時的啟動時間. 就其本身而言, 系統殺掉這些進程的目的是為了在這些空進程和底層的核心緩存之間平衡整個系統的資源.?www.2cto.com
當需要給一個進程分類的時候, 系統會在該進程中處于活動狀態的所有組件里掉選一個重要等級最高作為分類依據. 查看Activity, Service,和IntentReceiver的文檔, 了解每個組件在進程整個生命周期中的貢獻. 每一個classes的文檔詳細描述他們在各自應用的生命周期中所起得作用.

  # 7:application 的context #
    1、它描述的是一個應用程序環境的信息,即上下文。
    2、該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現類(后面我們會講到是ContextIml類)。
    3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啟動一個Activity,發送廣播,接受Intent
信息 等。。

摘自:http://blog.csdn.net/pi9nc/article/details/11200969

轉載于:https://www.cnblogs.com/fuck1/p/5453958.html

總結

以上是生活随笔為你收集整理的Android使用Application总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。