【Android開發】完美解決Android完全退出程式

来源:http://www.cnblogs.com/shouce/archive/2016/02/22/5206057.html
-Advertisement-
Play Games

背景:假說有兩個Activity, Activity1和Activity2, 1跳轉到2,如果要在2退出程式,一般網上比較常見的說法是用 System.exit(0) 或是 android.os.Process.killProcess(android.os.Process.myPid()) 但實際應


背景:假說有兩個Activity, Activity1和Activity2, 1跳轉到2,如果要在2退出程式,一般網上比較常見的說法是用  

System.exit(0)

或是

android.os.Process.killProcess(android.os.Process.myPid())

但實際應用中,並不是能夠真正退出,問題出在?1跳轉到2時,如果Activity1你finish掉了,兩麽是可以退出程式的,但有時1跳轉到2時,我們不能將Activity1 finish掉,那麼在Activity2就不能退出程式。於是有更好的退出程式的方法,不管你有沒有finish前一個activiy都可以退出程式, 或是

final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); am.restartPackage(getPackageName());

但記得在androidmanifest.xml里添加許可權 

<uses-permission android:name="android.permission.RESTART_PACKAGES"> 
</uses-permission> 
以上方法在2.1版本以前都能使用,但是2.2以後統統作廢,幾經折騰,終於覓得終極解決方案: 

Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); System.exit(0);

至於為什麼google要取消掉restartPackage()這麼好用的方法,君可參見下文: 
android的原理,為什麼我們不需要手動關閉程式 
  不用在意剩餘記憶體的大小,其實很多人都是把使用其他系統的習慣帶過來來了。android大多應用沒有退出的設計其實是有道理的,這和系統對進程的調度機制有關係。如果你知道java,就能更清楚這機制了。其實和java的垃圾回收機制類似,系統有一個規則來回收記憶體。進行記憶體調度有個閥值,只有低於這個值系統才會按一個列表來關閉用戶不需要的東西。當然這個值預設設置得很小,所以你會看到記憶體老在很少的數值徘徊。但事實上他並不影響速度。相反加快了下次啟動應用的速度。這本來就是android標榜的優勢之一,如果人為去關閉進程,沒有太大必要。特別是使用自動關進程的軟體。(這裡解決了大家非要關進程的誤區!) 
        到這裡有人會說了,那為什麼記憶體少的時候運行大型程式會慢呢?其實很簡單,在記憶體剩餘不多時打開大型程式,會觸發系統自身的調進程調度策略,這是十分消耗系統資源的操作,特別是在一個程式頻繁向系統申請記憶體的時候。這種情況下系統並不會關閉所有打開的進程,而是選擇性關閉,頻繁的調度自然會拖慢系統。所以,論壇上有個更改記憶體閥值的程式可以有一定改善。但改動也可能帶來一些問題,取決於值的設定。 
       那麼,進程管理軟體有無必要呢?有的。就是在運行大型程式之前,你可以手動關閉一些進程釋放記憶體,可以顯著的提高運行速度。但一些小程式,完全可交由系統自己管理。 
       談到這裡,可能有的朋友會問,如果不關程式是不是會更耗電。我就說說android後臺的原理,你就明白了。android的應用在被切換到後臺時,它其實已經被暫停了,並不會消耗cpu資源,只保留了運行狀態。所以為什麼有的程式切出去重進會到主界面。但是,一個程式如果想要在後臺處理些東西,如音樂播放,它就會開啟一個服務。服務可在後臺持續運行,所以在後臺耗電的也只有帶服務的應用了。這個在進程管理軟體里能看到,標簽是service。至於廣播什麼的我就不涉及了。所以沒有帶服務的應用在後臺是完全不耗電的,沒有必要關閉。這種設計本來就是一個非常好的設計,下次啟動程式時,會更快,因為不需要讀取界面資源,何必要關掉他們抹殺這個android的優點呢?(告訴我們如何合理使用進程管理軟體) 
       還有一個,為什麼android一個應用看起來那麼耗記憶體。大家知道,android上的應用是java,當然需要虛擬機,而android上的應用是帶有獨立虛擬機的,也就是每開一個應用就會打開一個獨立的虛擬機。這樣設計的原因是可以避免虛擬機崩潰導致整個系統崩潰,但代價就是需要更多記憶體。(跟塞班也不一樣,安卓不容易死機重啟)
        以上這些設計確保了android的穩定性,正常情況下最多單個程式崩潰,但整個系統不會崩潰,也永遠沒有記憶體不足的提示出現。大家可能是被windows毒害得太深了,總想保留更多的記憶體,但實際上這並不一定會提升速度,相反卻喪失了程式啟動快的這一系統特色,很沒必要。大家不妨按我說的習慣來用用這個系統。 
      祝大家玩機愉快,這系統開十天半個月都沒問題,不是windows。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 常用命令 ls 顯示當前目錄下的文件和文件夾; -ltr 按時間順序顯示文件和文件夾的詳細信息,不帶參數的時候 只顯示文件夾和文件。 vi 打開文件的內容 tar -cvf file.tar file 壓縮成tar包 tar -xvf file.tar file 解壓縮tar包,後面的file
  • 轉載自:http://blog.csdn.net/luo86106/article/details/6946255 .gz 解壓1:gunzip FileName.gz 解壓2:gzip -d FileName.gz 壓縮:gzip FileName .tar.gz 解壓:tar zxvf File
  • ubuntu系統自帶截圖功能使用介紹 ubuntu自定義截圖快捷鍵:Shift+PrtSc 截取當前視窗快捷鍵:Alt+PrtSc 保存全屏截圖:PrtSc
  • 改進uwsgi啟動腳本,使其支持多個獨立配置文件。
  • 寫在前面 2012年寫的,僅供參考 反彙編的目的 缺乏某些必要的說明資料的情況下, 想獲得某些軟體系統的源代碼、設計思想及理念, 以便複製, 改造、移植和發展; 從源碼上對軟體的可靠性和安全性進行驗證,對那些直接與CPU 相關的目標代碼進行安全性分析; 涉及的主要內容 分析ARM處理器指令的特點,以
  • 編寫i2c設備驅動(從設備)一般有兩種方式: 1.用戶自己編寫獨立的從設備驅動,應用程式直接使用即可。 2.linux內核內部已經實現了一個通用的設備驅動,利用通用設備驅動編寫一個應用程式(用戶態驅動),在應用程式中用到大量設備驅動提供的介面,通過應用程式來控制從設備。 匯流排驅動 4.1 概述 I2
  • 一 打開 Apache 的配置文件 httpd.conf 。二 將#LoadModule rewrite_module modules/mod_rewrite前面的#去掉三 在 httpd.conf中添加:<IfModule mod_rewrite.c>RewriteEngine On#Rewrit
  • 每一個應用程式中都有一個NSNotificationCenter實例,用來協助不同的對象之間的通信,任何一個對象都可以向通知中心發佈通知(NSNotication),在通知中描述自己做什麼。其他的感興趣的對象可以申請在某個特定的通知或者特定對象發出通知時接收到這個通知。 一個通知一般包含有3個屬性:
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...