多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > android application生命周期介紹

android application生命周期介紹

來源:程序員人生   發布時間:2015-02-13 08:35:36 閱讀次數:40349次

看到application這個類,1直不知道這個是干甚么用的,今天恰好有點時間,所以進行了詳細的學習。

1.先對它的整體概念解釋:

在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方法來取得1個application對象,再做出相應 的處理。



例如Launcher模塊中;它自己就寫了個application,在AndroidManifest.xml中將它進行了設置:

<application
        android:name="com.android.launcher2.LauncherApplication"

對他的設置可以參考這個模塊。


2.里面的方法進行說明:

      onCreate();

                          /**
                             * Called when the application is starting, before any other application
                             * objects have been created.  Implementations should be as quick as
                             * possible (for example using lazy initialization of state) since the time
                             * spent in this function directly impacts the performance of starting the
                             * first activity, service, or receiver in a process.
                             * If you override this method, be sure to call super.onCreate().
                          */

                        這個函數是當我們的利用開始之時就被調用了,比利用中的其他對象創建的早,這個實現盡量的快1點,由于這個時間直接影響到我們第1個activity/service

                        /receiver。如果你要重寫這個方法必須調用super.onCreate().

      onTerminate():

                         /**
                            * This method is for use in emulated process environments.  It will
                            * never be called on a production Android device, where processes are
                            * removed by simply killing them; no user code (including this callback)
                            * is executed when doing so.
                         */

                        這個函數是摹擬1個進程環境,在真機中永久也不會被調用。


Android Application對象必須掌握的7點

作者:皇馬船長更新于 07月01日訪問(1589)評論(4

1:Application是甚么?

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

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

2:通過Application傳遞數據

1 2
假設有1個Activity A, 跳轉到 Activity B ,并需要推薦1些數據,通常的作法是Intent.putExtra() 讓Intent攜帶,或有1個Bundle把信息加入Bundle讓Intent推薦Bundle對象,實現傳遞。但這樣作有1個問題在 于,Intent和Bundle所能攜帶的數據類型都是1些基本的數據類型,如果想實現復雜的數據傳遞就比較麻煩了,通常需要實現 Serializable或Parcellable接口。這實際上是Android的1種IPC數據傳遞的方法。如果我們的兩個Activity在同1個 進程當中為何還要這么麻煩呢,只要把需要傳遞的對象的援用傳遞過去就能夠了。 基本思路是這樣的。在Application中創建1個HashMap ,以字符串為索引,Object為value這樣我們的HashMap就能夠存儲任何類型的對象了。在Activity A中把需要傳遞的對象放入這個HashMap,然后通過Intent或其它途經再把這索引的字符串傳遞給Activity B ,Activity B 就能夠根據這個字符串在HashMap中取出這個對象了。只要再向下轉個型 ,就實現了對象的傳遞。

3:Application數據緩存

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

4:PitFalls(漢語:易犯的毛病)

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

5:MemoryLeak

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

1 2 3
備注:常常致使內存泄漏核心緣由: keeping a long-lived reference to a Context.持有1個context的對象,從而gc不能回收。 情況以下:

  1.1個View的作用域超越了所在的Activity的作用域,比如1個static的View或把1個View cache到了application當中 etc
理解:內存:注意靜態的數據和緩存中的數據;注意釋放;
  2.某些與View關聯的Drawable的作用域超越了Activity的作用域。
3.Runnable對象:比如在1個Activity中啟用了1個新線程去履行1個任務,在這期間這個Activity被系統回收了, 但Runnalbe的 任務還沒有履行終了并持有Activity的援用而泄漏,但這類泄漏1般來泄漏1段時間,只有Runnalbe的線程履行完閉,這個 Activity又可以被正常回收了。

4.內存類的對象作用域超越Activity的范圍:比如定義了1個內存類來存儲數據,又把這個內存類的對象傳給了其它Activity 或Service等。由于內部類的對象會持有當前類的援用,所以也就持有了Context的援用。解決方法是如果不需要當前的援用把內部類寫成static或,把內部類抽取出來變成1個單獨的類,或把避免內部對象作用域超越Activity的作用域。out Of Memery Error 在android中每個程序所分到的內存大小是有限的,如果超過了這個數就會報Out Of Memory Error。 android給程序分配的內存大小與手機硬件有關,以下是1些手機的數據:
G1:16M Droid:24 Nexus One:32M Xoom:48Ms
所以盡可能把程序中的1些大的數據cache到本地文件。以避免內存使用量超標。
記得數據傳遞完成以后,把寄存在application的HashMap中的數據remove掉,以避免產生內存的泄漏

6:生命周期:

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

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

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


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 爱啪网亚洲第一福利网站 | 亚洲国产高清一区二区三区 | 亚洲成人免费 | 亚洲欧美人成人综合在线50p | www.爱爱.com| 中文字幕免费看 | 免费网站看v片在线香蕉 | 夜夜爽www| 亚洲第一页在线观看 | 日韩不卡一区二区三区 | 红豆视频在线观看日本 | 亚洲韩精品欧美一区二区三区 | 欧美一区二区三区不卡视频 | 国产乱人乱精一区二区视频密 | 在线观看国产精品麻豆 | 无毒不卡 | 国产成人精品免费视频大全五级 | 精品国产91乱码一区二区三区 | 亚洲高清网站 | 在线免费观看a级片 | 亚洲精品国产男人的天堂 | 日本wwwwwwwww| 免费成人在线播放 | 春色视频www免费视频观看 | 偷拍区自拍区 | 国产啪视频1000部免费视频 | 日韩久久精品一区二区三区 | 日韩一级片在线免费观看 | 一级一级毛片看看 | 日本三级日本三级日本三级极 | 国内精品视频九九九九 | 中文精品99久久国产 | 伊人久久成人 | 久久午夜羞羞影院免费观看 | 亚洲日本在线观看网址 | 久久久久久久久一次 | 超清中文乱码精品字幕在线观看 | 日韩欧美大片 | 日韩久久网| 久久久久久久综合日本亚洲 | 欧美日韩成人在线视频 |