<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [Android問(wèn)答] 如何應(yīng)對(duì)Activity進(jìn)程被殺?

      我們要了解Android手機(jī)開(kāi)發(fā)與桌面開(kāi)發(fā)有一個(gè)主要不同之處:通常在一部Android手機(jī)里同時(shí)運(yùn)行著多個(gè)應(yīng)用(app),每個(gè)app對(duì)應(yīng)一個(gè)系統(tǒng)進(jìn)程,當(dāng)系統(tǒng)需要更多的資源(如內(nèi)存)而空閑資源不足時(shí),Android系統(tǒng)就會(huì)選擇殺掉一些“低優(yōu)先級(jí)”的進(jìn)程以便釋放所需資源。

      Android系統(tǒng)是如何確定進(jìn)程優(yōu)先級(jí)的高低的呢?

      • 如果一個(gè)app正在與用戶(hù)交互,那么它所在的進(jìn)程具有最高優(yōu)先級(jí);
      • 其次,如果一個(gè)app是可見(jiàn)的,例如被一個(gè)對(duì)話(huà)框部分遮擋,它所在進(jìn)程具有第二高的優(yōu)先級(jí);
      • 再次,如果app當(dāng)前是不可見(jiàn)的,也就是被切換到了后臺(tái),則它所在進(jìn)程具有第三高的優(yōu)先級(jí);這里要補(bǔ)充一點(diǎn),如果這個(gè)后臺(tái)app啟動(dòng)了一個(gè)service,則它比一般的后臺(tái)app優(yōu)先級(jí)高一些。
      • 最后,如果一個(gè)進(jìn)程里沒(méi)有包含任何app,這個(gè)進(jìn)程的優(yōu)先級(jí)是最低的。

      當(dāng)系統(tǒng)資源嚴(yán)重不足時(shí),任何一個(gè)進(jìn)程都有可能被殺掉,而當(dāng)用戶(hù)想回到一個(gè)已經(jīng)不存在于內(nèi)存中的Activity時(shí),系統(tǒng)只得新建一個(gè)這樣的Activity對(duì)象并調(diào)用它的onCreate()方法進(jìn)行恢復(fù)。所以有時(shí)出現(xiàn)這種狀況:一個(gè)app大部分時(shí)間運(yùn)行很好,偶爾在切換Activity時(shí)出現(xiàn)空指針異常導(dǎo)致強(qiáng)制關(guān)閉,這多半是在onCreate()方法里使用了已經(jīng)被重置為空的對(duì)象(例如intent里的變量)造成的。即使不出現(xiàn)異常,也會(huì)造成表單數(shù)據(jù)丟失等嚴(yán)重影響使用體驗(yàn)的問(wèn)題。

      要解決這類(lèi)問(wèn)題,切不可抱“現(xiàn)在手機(jī)內(nèi)存大,進(jìn)程一般不會(huì)被殺掉”這種僥幸心理,而應(yīng)該以“應(yīng)用隨時(shí)都會(huì)被殺掉”的態(tài)度來(lái)謹(jǐn)慎處理,下面介紹Google建議的方式。

      解決方法

      由于Activity隨時(shí)可能需要重建,所以我們要做的事情就是在適當(dāng)?shù)奈恢脤ctivity所需數(shù)據(jù)進(jìn)行持久化(從ram復(fù)制到rom或sd卡),并在onCreate()方法里利用這些數(shù)據(jù)恢復(fù)現(xiàn)場(chǎng)。

      Activity有兩類(lèi)數(shù)據(jù)需要進(jìn)行持久化處理:“文檔類(lèi)型數(shù)據(jù)”和“內(nèi)部狀態(tài)類(lèi)型數(shù)據(jù)”,前者例如用戶(hù)正在編輯的表單,后者如用戶(hù)偏好。

      一、為了持久化文檔類(lèi)型的數(shù)據(jù),Google建議使用”即時(shí)生效”(edit in place)的編輯策略,具體的方式如下:

      • 用戶(hù)新建文檔時(shí),在SQLite數(shù)據(jù)庫(kù)(根據(jù)需要也可以使用preference)里也立即新建一條記錄。(與此相對(duì)的方式是:為用戶(hù)提供一個(gè)“保存”按鈕,只有當(dāng)用戶(hù)按下按鈕時(shí)才將文檔保存到數(shù)據(jù)庫(kù)。)
      • 當(dāng)用戶(hù)離開(kāi)當(dāng)前Activity時(shí),onPause()方法會(huì)被觸發(fā),在這個(gè)方法里將當(dāng)前正在編輯的文檔持久化到數(shù)據(jù)庫(kù)。這樣一來(lái),如果用戶(hù)是從這個(gè)Activity切換到另一個(gè)相關(guān)Activity,仍然可以看到剛剛保存的內(nèi)容。

      這種方式可以最大限度避免數(shù)據(jù)丟失,只要onPause()方法被觸發(fā)執(zhí)行,即使Activity所在進(jìn)程被系統(tǒng)kill掉也不會(huì)造成數(shù)據(jù)丟失。唯一要注意的是,界面上最好能提供一個(gè)“取消”按鈕或菜單,以便讓用戶(hù)可以選擇不保存對(duì)文檔的更改。

      二、為了持久化內(nèi)部狀態(tài)類(lèi)型的數(shù)據(jù),可以在onPause()里使用Activity#getPreferences(int)方法,這個(gè)方法返回SharedPreferences類(lèi)型的對(duì)象,利用它可以記錄用戶(hù)對(duì)這個(gè)Activity的偏好信息。例如一個(gè)日歷應(yīng)用,用戶(hù)可以選擇顯示為周視圖或月視圖,這樣的信息作為內(nèi)部狀態(tài)記錄到SharedPreferences對(duì)象以后,下次再打開(kāi)這個(gè)Activity時(shí)就可以按用戶(hù)上次的選擇來(lái)顯示日歷了。

      以下代碼來(lái)自官方文檔,演示了如何持久化并恢復(fù)一個(gè)Activity的當(dāng)前顯示模式:

       public class CalendarActivity extends Activity {
           ...
      
           static final int DAY_VIEW_MODE = 0;
           static final int WEEK_VIEW_MODE = 1;
      
           private SharedPreferences mPrefs;
           private int mCurViewMode;
      
           protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               //取回之前持久化的日歷顯示模式
               SharedPreferences mPrefs = getSharedPreferences();
               mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE);
           }
      
           protected void onPause() {
               super.onPause();
      
               //持久化日歷顯示模式 
               SharedPreferences.Editor ed = mPrefs.edit();
               ed.putInt("view_mode", mCurViewMode);
               ed.commit();
           }
       }

      是有點(diǎn)麻煩,但為了能讓app穩(wěn)定運(yùn)行也值了。

      有些同學(xué)要問(wèn)了,為什么是在onPause()里持久化而不是在onSaveInstanceState()里?官方文檔有下面一段話(huà)簡(jiǎn)要解釋了原因,即前者比后者更可靠,因?yàn)閛nSaveInstanceState()不屬于Activity生命周期的一部分。——既然如此,我想不出onSaveInstanceState()還有什么其他用途了,大家干脆忘了它吧,還有onRestoreInstanceState()。

      Note that it is important to save persistent data in onPause() instead of onSaveInstanceState(Bundle) because the latter is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation.

      注1:關(guān)于上面這段話(huà),網(wǎng)上存有一些爭(zhēng)議,我個(gè)人還是比較傾向在onPause()里做持久化——既可靠又好記,唯一的缺點(diǎn)是調(diào)用次數(shù)稍多。

      注2:從Android 3.0(HoneyComb)版本開(kāi)始,Activity進(jìn)程在被系統(tǒng)殺掉之前,將保證onStop()方法先執(zhí)行完成,因此如果我們開(kāi)發(fā)的應(yīng)用只運(yùn)行在3.0以上,可以把持久化工作放在onStop()里以減少持久化的次數(shù)。

      最佳實(shí)踐

      不要抱僥幸心理,你的Activity隨時(shí)可能被銷(xiāo)毀。

      解決方法:在onPause()里持久化Activity數(shù)據(jù),在onCreate()里恢復(fù)現(xiàn)場(chǎng)

      參考資料:

      ActivitySaving Activity state in Android

      posted @ 2012-11-08 10:28  八進(jìn)制  閱讀(11141)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: 九九热精品在线观看视频| 99在线精品国自产拍中文字幕| 国产香蕉尹人在线视频你懂的| 少妇扒开双腿自慰出白浆| 精品国产一区二区三区av色诱| 亚洲国产一成人久久精品| 国产在线不卡精品网站| 无码 人妻 在线 视频| 美女午夜福利视频一区二区| 人妻少妇偷人精品一区| 亚洲一区二区三区在线| 亚洲成在人线AV品善网好看| 少妇无套内谢免费视频| 国产精品v片在线观看不卡| 青草精品国产福利在线视频| 免费观看全黄做爰大片| 亚洲性日韩一区二区三区| 性无码专区无码| 亚洲精品国产一二三区| 中文字幕av一区二区| 人妻系列无码专区免费 | 亚洲精品久久久久国色天香| 国产麻豆成人传媒免费观看| 性高湖久久久久久久久| 国产精品普通话国语对白露脸| 国产精品一二三区蜜臀av| 亚洲乱理伦片在线观看中字| 久章草这里只有精品| 精品乱码一区二区三四五区 | 日本不卡的一区二区三区| 红杏av在线dvd综合| 国产999久久高清免费观看| 男人天堂亚洲天堂女人天堂| 实拍女处破www免费看| 日韩av不卡一区二区在线| 精品麻豆国产色欲色欲色欲WWW| 国产高清在线男人的天堂| 亚洲无av在线中文字幕| 临海市| 看免费的无码区特aa毛片| 免费人成在线观看网站|