Android中進程生命周期的優先順序

来源:http://www.cnblogs.com/YukiKun/archive/2016/01/17/5136708.html
-Advertisement-
Play Games

Android中進程生命周期的優先順序


“我們不是生產者,我只是大自然的搬運工。”

學習Android最好的途徑當然是強大的官方文檔了,其中在Processes and Threads一節中對於進程生命周期淘汰優先順序,有著詳細的介紹。原文如下:

Process lifecycle

The Android system tries to maintain an application process for as long as possible, but eventually needs to remove old processes to reclaim memory for new or more important processes. To determine which processes to keep and which to kill, the system places each process into an "importance hierarchy" based on the components running in the process and the state of those components. Processes with the lowest importance are eliminated first, then those with the next lowest importance, and so on, as necessary to recover system resources.

上文大致意思就是說Android系統會儘量維持進程的存在,但畢竟資源有限,當系統資源告急的時候會淘汰一部分進程。淘汰順序的憑據就是系統進程的優先順序了,優先順序越高越不容易被殺死,反之亦然。系統總共為進程分了五個優先順序,如下(原文後附筆者融合個人理解的簡譯):

  1. Foreground process

    A process that is required for what the user is currently doing. A process is considered to be in the foreground if any of the following conditions are true:

    Generally, only a few foreground processes exist at any given time. They are killed only as a last resort—if memory is so low that they cannot all continue to run. Generally, at that point, the device has reached a memory paging state, so killing some foreground processes is required to keep the user interface responsive.

  2. Visible process

    A process that doesn't have any foreground components, but still can affect what the user sees on screen. A process is considered to be visible if either of the following conditions are true:

    • It hosts an Activity that is not in the foreground, but is still visible to the user (its onPause() method has been called). This might occur, for example, if the foreground activity started a dialog, which allows the previous activity to be seen behind it.
    • It hosts a Service that's bound to a visible (or foreground) activity.

    A visible process is considered extremely important and will not be killed unless doing so is required to keep all foreground processes running.

  3. Service process

    A process that is running a service that has been started with the startService() method and does not fall into either of the two higher categories. Although service processes are not directly tied to anything the user sees, they are generally doing things that the user cares about (such as playing music in the background or downloading data on the network), so the system keeps them running unless there's not enough memory to retain them along with all foreground and visible processes.

  4. Background process

    A process holding an activity that's not currently visible to the user (the activity's onStop() method has been called). These processes have no direct impact on the user experience, and the system can kill them at any time to reclaim memory for a foreground, visible, or service process. Usually there are many background processes running, so they are kept in an LRU (least recently used) list to ensure that the process with the activity that was most recently seen by the user is the last to be killed. If an activity implements its lifecycle methods correctly, and saves its current state, killing its process will not have a visible effect on the user experience, because when the user navigates back to the activity, the activity restores all of its visible state. See the Activities document for information about saving and restoring state.

  5. Empty process

    A process that doesn't hold any active application components. The only reason to keep this kind of process alive is for caching purposes, to improve startup time the next time a component needs to run in it. The system often kills these processes in order to balance overall system resources between process caches and the underlying kernel caches.                                                                                                                                   

一、前臺進程(進程滿足如下任一條件即為前臺進程):

1. 擁有 一個執行了onresume方法正在與用戶交互(獲得焦點)的Activity
2. 擁有一個service,這個Service跟正在與用戶交互的Activity進行了綁定
3. 擁有一個Service,這個Service調用了startForeground()方法
4. 擁有一個正在執行onCreate()、onStart()或者onDestroy()方法中的任意一個的Service
5. 擁有一個正在執行onReceive方法的BroadcastReceiver

 

二、可見進程:

1. 擁有一個執行了onPause方法,但仍然可見的Activity
2. 擁有一個Service,這個Service跟一個可見的或前臺的Activity綁定了

 

三、服務進程:

擁有一個通過startService方法啟動的Service的進程

 

四、後臺進程:

擁有一個後臺Activity(onStop方法被調用)的進程

 

五、空進程:

沒有擁有任何活動的應用組件的進程,也就是沒有任何Service和Activity在運行

 

另外,還有一些需要補充的,當一個進程滿足多個進程條件時,當然是取優先順序更高的為準,比如一個進程同時滿足前臺進程和服務進程的條件,這個進程就是個前臺進程,這點很好理解。另外,進程的優先順序也不是一成不變的,而且有時候會隨著一些相關的因素而發生改變;比如,某進程A滿足前臺進程的第二個條件,進程A擁有一個service,這個Service跟正在與用戶交互的Activity進行了綁定;當這個Activity變成可見狀態了,進程A便不再滿足前臺進程的條件,進而因滿足可見進程的第二個條件,進程A變成了可見進程。總之,在掌握了基本概念之後,需要細心的分析具體的情況,方能得出正確的判斷。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 手動安裝django_chartit庫1 下載壓縮包2 解壓到python安裝目錄下,文件夾名為django_chartit,並檢查文件夾下是否有setup.py文件3 在cmd中進入django_chartit文件夾下,cmd命令為 cd C:\Python27\django_chartit4 輸...
  • 搭建一個簡單的跨平臺C開發的基礎框架, 主要是使用posix線程庫和 自己寫的一個分級 日誌庫,以後可以在這個基礎上搭建你需要的框架會容易一點. 在Window和Linux上測試通過.
  • 服務定位器隱藏了類之間的依賴關係,導致錯誤從編譯時推遲到了運行時,並且,在引入破壞性更改時,這個模式導致代碼不清晰,增加了維護難度。
  • 什麼是微服務 微服務應用的一個最大的優點是,它們往往比傳統的應用程式更有效地利用計算資源。這是因為它們通過擴展組件來處理功能瓶頸問題。這樣一來,開發人員只需要為額外的組件部署計算資源,而不需要部署一個完整的應用程式的全新迭代。最終的結果是有更多的資源可以提供給其它任務。 • 一種軟體架構模式 • 復...
  • 10th Anniversary of jQueryToday marks the 10th anniversary of the release of jQuery...[原文]今天是jQuery發佈十周年. 那時還在上大學,我在2006年紐約的BarCamp上宣佈的。難以想象它會發展到今天這種程...
  • 幾個重要概念,完全是自己的理解。 文件流操作。具體來講就是用createReadStream來代替readFile,這樣做的原因就是讀文件時先要讀入緩衝區buffer,如果文件過大那麼需要的緩衝去也就很大,所以用stream 來代替 。stream大概的工作原理是分成小塊,然後傳輸。 Stream:...
  • 最近在看《Head First Ajax》,雖然書里代碼給的已經夠詳細了,但在手過一遍代碼時還是引發了一些知識點的思考和擴展。書還沒看完,這篇文章我打算是對於那本書邊看邊總結。 Ajax代碼思路 創建請求對象 配置請求對象併發送到伺服器 伺服器應答請求對象(1) 創建請求對象,作為和伺服器進行通訊的...
  • 正則基礎1、元字元 [擁有特殊含義的元字元] \d -> 匹配一個0-9的數字,相當於[0-9],和它相反的是\D ->匹配一個除了0-9的任意字元 \w -> 匹配一個0-9、a-z、A-Z、_的數字或字元,相當於[0-9a-zA-Z_] \s -> 匹配一個空白字元(空格、製表符...)...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...