1. 程式人生 > >為何Android開發中不推薦使用static全域性變數傳參

為何Android開發中不推薦使用static全域性變數傳參

  原文連結

Android開發中一般都是使用Intent給Activity傳參。有時需要傳複雜物件時,我們會傾向於用全域性變數(靜態變數或Application屬性)。但其實這樣做是有隱患的,跟Activity的生命週期有關,正好最近遇到這個問題,在這裡寫一下。

大概情況是這樣的:ActivityA中點選按鈕啟動ActivityB,同時要傳一個大資料物件,懶得對這個物件進行序列化,於是就直接搞了個全域性變數ActivityB.param寫了進去,在ActivityB.onCreate裡讀取並顯示資訊,編譯執行一切正常。這樣過了大半個月似乎也沒發現什麼問題。直到有一天發給客戶使用後,在友盟後臺看到了空指標錯誤,仔細分析堆疊程式碼,錯誤就在ActivityB.onCreate裡讀取全域性變數時發生,也就是全域性變數返回了空!

全域性變數為空一般就是由於記憶體不足程序被KILL過重新建立了。按常理分析,ActivityA在給ActivityB.param賦值後會立即啟動ActivityB,這過程很短,程序不可能這麼快被KILL,因此理論上ActivityB.onCreate中應該能讀取到ActivityB.param的。

實際上,在ActivityA給ActivityB.param賦值啟動ActivityB後,ActivityB.onCreate確實是能讀取到ActivityB.param的;但是,ActivityB並不能保證永遠在前臺,一旦ActivityB所在任務被切到後臺(如有電話打進來了),系統就可以在記憶體不足時將ActivityB所在的程序KILL掉;而當ActivityB所在任務被切回前臺(如電話打完了),這時系統會自動重新恢復ActivityB,這時全域性變數自然就沒了。

有人說我不用靜態變數,用Application的屬性來存全域性引數,是不是就可以避免這個問題了呢?其實也是不行的,因為程序被KILL再恢復後,Application物件也是銷燬重建了的;安卓系統並不保證會在KILL程序前給程式發通知,因此我們也無法在Application裡儲存恢復全域性變數。

另外,全域性變數也不能記錄安卓的介面Context相關的類(如Activity、View),因為安卓系統自動管理這些類,記錄它們會導致引用計數增加無法釋放的記憶體洩露問題;如果一定要記錄,則應該使用弱引用WeakReference。

總之安卓開發中是不推薦用全域性變數傳參的。最好的辦法還是按照安卓的開發規範,完全使用Intent進行傳參,因為系統在KILL程序前會自動儲存Activity堆疊,同時儲存相關的Intent引數,並自動進行恢復。如果非要用全域性變數,則至少必須在讀取全域性變數處理時判斷是否為空,避免程式出錯崩潰;同時最好在onPause時自行儲存資料以便被KILL後恢復。

但是我覺得全域性變數也不是一無是處完全不能用,主要是要理解並避開安卓程序生命週期中全域性變數的變化。例如用全域性變數來記錄自己寫的全域性處理類(如工廠類、類註冊器等),只要注意在被程序KILL後做好恢復工作,是完全可以的。

建議:1. 傳遞資料使用intent

      2. 儲存狀態值,比如登陸狀態用SharedPreference

      3. 其他資料可以用SQLite / 檔案 儲存起來

相關推薦

為何Android開發推薦使用全域性數傳

Android開發中一般都是使用Intent給Activity傳參。有時需要傳複雜物件時,我們會傾向於用全域性變數(靜態變數或Application屬性)。但其實這樣做是有隱患的,跟Activity的生命週期有關,正好最近遇到這個問題,在這裡寫一下。 大概情況是這樣的:A

為何Android開發推薦使用static全域性數傳

  原文連結 Android開發中一般都是使用Intent給Activity傳參。有時需要傳複雜物件時,我們會傾向於用全域性變數(靜態變數或Application屬性)。但其實這樣做是有隱患的,跟Activity的生命週期有關,正好最近遇到這個問題,在這裡寫一下。 大概情

android 開發遇到的坑(定期新增)

學了android好久還是小白的傻孩子,遇到了各種奇奇怪怪的坑,記錄一下以防忘記。 8.0坑: 坑1:傳送Intent訊息開啟apk安裝程式,6.0的手機用的好好的,到8.0手機安裝頁面就一閃而過了 原因:8.0移除了“允許未知來源”的檢查框,它關掉了!!!!所以我這個未知來源的安裝就被

解決Android開發ViewPager動態設定PagerAdapter時第二次進入Fragment內容顯示的問題

問題描述 筆者最近的Android專案要用到PagerSlidingTabStrip和ViewPager的組合,但是從github上下載原始碼後順利執行示例專案,用到自己的專案後發現一個問題,就是第二次進入該ViewPager所在Fragment後PagerS

Android學習筆記 —— Android 開發,限制 EditText 輸入框能輸入中文(漢字)

今天在練習開發一個小專案的時候,需要限制 EditText 輸入框不能輸入中文(漢字),在網上找了很多例子,  結合自己的實際,終於完成了這一功能。現在把程式碼記錄下來,方便以後查詢! 首先是xml佈

關於Android開發啟動應用但桌面顯示圖示的問題

本人開發Android不久,今天在一個新建的專案中突然遇到除錯的應用雖然啟動了,但是安卓系統桌面不顯示圖示。 度過之後發現並沒什麼用。 網上的方案 <intent-filter> <action android:name="android.int

Android開發eclipse DDMS的devices裡面看到連線的手機

eclipse DDMS的devices裡面看不到連線的手機 1 開始執行cmd 2 adb kill-server 殺死adb程序 3 adb start-server 開啟adb程序 4

Android 開發使用getAssets獲取到檔案的問題

assets和res ,java 是在同一層目錄此外還有該目錄下放置的原生資原始檔      因為系統在編譯的時候不會編譯assets下的資原始檔,所以我們不能通過R.XXX.ID的方式訪問它們。那我麼能不能通過該資源的絕對路徑去訪問它們呢?因為apk安裝之後會放在/data

Android學習筆記 —— Android開發呼叫系統瀏覽器直接在應用顯示指定網址的內容

在開發過程中有一個在應用中直接顯示一個網址的內容,而不是呼叫系統瀏覽器顯示。根據網上大神的例子,終於實現了這一功能!現在把這個功能記錄下來,方便以後使用! 首先是xml檔案佈局,就一個簡單的WebView: activity_webview.xml: <?xml v

Android開發有用工具之--Log工具類

util lena 日誌 日誌信息 stat 們的 常常 我們 imp 在開發的過程中。我們常常會使用Log來輸出日誌,幫助我們來調試程序 可是有時候並不能全然滿足我們的須要 ,比方我想知道這個日誌信息是來自於哪一個包 哪一個類 所以我們封裝一個這個Log類。方便我們的

Android學習探索之Java 8 在Android 開發的應用

相關 概念 容易 並不是 min etc bstr trac flavor 前言: Java 8推出已經將近2年多了,引入很多革命性變化,加入了函數式編程的特征,使基於行為的編程成為可能,同時減化了各種設計模式的實現方式,是Java有史以來最重要的更新。但是Androi

android開發如何使用JavaMail程序

有一個 pro 會話 jpg names prot get ext 會有  javaMail,是提供給開發者處理電子郵件相關的編程接口。它是Sun發布的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。我們可以基於JavaMail開發出類似於Microsoft

Android開發的各種尺度單位

href roi 放大 pla blank 區別 csdn tro 自定義 px 像素(pixel),表示屏幕上一個物理像素點 不建議直接使用 px 繪制UI,因為受像素密度的影響,以 px 為單位繪制的UI在不同手機上顯示的實際大小會不同 dp (用於定義控件

android開發——Android開發的47個小知識

環境 底部 枚舉 目前 mount ram 啟動 creat ica 1、判斷sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environm

Android開發幾種有用的的日歷控件實現

顯示 lec 外觀 翻頁 frame 時間 lean android平臺 星期 我們大家都知道,在Android平臺3.0中才新增了日歷視圖控件,可以顯示網格狀的日歷內容,那麽對於3.0以下的版本要使用日歷控件只能借助第三方,目前用的最多的是CalendarView。 先簡

Android開發java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}

net 控件 view etc spi pos rst ack data Android開發中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullP

Android開發dp,sp和px之間的轉換

font col art gpo ati pan ext 同時 style 本文轉載於 http://blog.csdn.net/student9128/article/details/53932470 眾所周知,在Android開發中dp和px,sp和px之間的轉換時必不

Android開發怎樣用多進程、用多進程的好處、多進程的缺陷、解決方法(轉)

傳遞 標簽 事情 打印 ide 即時通訊 ice cati 一個數 轉自:http://blog.csdn.net/spencer_hale/article/details/54968092 1.怎樣用多進程 Android多進程概念:一般情況下,一個應用程序就是一個進

Android開發XRecyclerview用法及遇到的一些問題

解決 pos sage head ebe 專業 剛才 adapt 只需要 目前通過xrecyclerview的開源代碼來實現系列功能,加載數據傳入type,值為1,2,3,分別表示初次加載,下拉刷新數據,上拉加載更多數據操作,刷新數據只需要重新放入數據,然後notifyDa

Android開發ScollView嵌套 WebView底部高度無法自適應解決

hbase get ride web algorithm 接口 試驗 splay 網頁加載 最近要做一個頁面,需要 ScrollView 嵌套 WebView,怎麽嵌套,怎麽解決焦點和 touch 事件沖突,網上一大堆,這裏就不贅述了,但是發現 WebView 從一個高度很