一次性關閉所有的activity

2021-08-01 12:27:23 字數 2751 閱讀 7859

看到很多關於應用退出的問題,今天在這裡為大家簡單總結一下,如果說的不對還望大家見諒。

方法一:system.exit(0) 和android.os.process.killprocess(android.os.process.mypid()),我想很多人都嘗試過,當關 閉多個activity的時候這兩個方法根本不起作用,原因當然和activity的堆疊管理有關。

activitymanager manager = (activitymanager)getsystemservice(activity_service);  manager.restartpackage(getpackagename());

android:name=」android.permission.restart_packages」/>

方法三:這個方法是2.2以後取代restartpackage的方法。但是google給的只是乙個空殼,這個方法依然不起作用。

activitymanager.killbackgroundprocesses(packagename);

方法四:建立乙個activityinstance單例模式來統一管理activity的退出。這是乙個很雞肋的方法,因為它確實有用,但又這麼寫又有點浪費。

具體做法就是寫乙個activityinstance單例,在每乙個activity啟動的時候都呼叫它的activityinstance.addactivity(this);方法,當退出應用時,呼叫activityinstance.exit();方法。

public void exit()

system.exit(0);

}

方法五:傳送廣播退出。在需要結束應用時,傳送乙個特定的廣播,每個activity收到廣播後關閉。如果不閒麻煩可以這樣做,個人來講還沒有方法四好。

方法六:遞迴退出,在開啟新的activity時使用startactivityforresult,然後自己加標誌,在onactivityresult中處理,遞迴關閉。

方法七:退出的時候跳轉回home,一種假的退出方法,但可以退出,該方法只是回到home頁而將本身應用虛假退出。

intent startmain = new intent(intent.action_main);

startmain.addcategory(intent.category_home);

startmain.setflags(intent.flag_activity_new_task);

startactivity(startmain);

system.exit(0);

方法八: activitymanager.forcestoppackage(packagename);看到forcestop是不是感覺還挺熟悉的,我們系統設定裡面關閉應用就是呼叫的這個方法。這個方法可以完全關閉應用程式而且只要乙個包名。

不過這個方法是系統隱藏的,我們寫應用的時候在activitymanager裡是找不到這個方法的。這就涉及到了呼叫系統隱藏api的方法。下面是通過反射機制來獲取該方法。

.getmethod("forcestoppackage", string.class);
method.invoke(sd,packname)

補充:其實android有自己的記憶體管理機制並不需要我們完全退出本身應用,當使用者按退出鍵的時候使用者回到home或其他相關介面即可。在沒有特殊要求的時候虛假退出就可以。(此方法需要手機root,並不實用)

方法九:可以利用清理歷史棧的方法,來巧妙關閉所有activity,首先用乙個設定為不可見的activity a來啟動程式,這個activity a的作用只是用來墊棧底,只有啟動和退出程式才會用到這個activity,而你需要退出的時候,只需要跳轉至這個activity a ,並讓a finish自己就可以實現關閉所有的activity。

intent intent = new intent();

intent.setclass(b.this, a.class); //b為你按退出按鈕所在的activity

intent.setflags(intent.flag_activity_new_task

|intent.flag_activity_clear_task); //最關鍵是這句

startactivity(intent);

intent.flag_activity_new_task|intent.flag_activity_clear_task使得處於棧底的a發揮推土機的作用,從最底層把棧裡所有的activity都清理掉,再在自己的oncreate方法加一句finish結束自己,即可實現退出。不放心的話,可以在a的ondestroy方法中加上system.exit(0) ,連跳轉過程中的執行緒也可以終止的。

至於如何初始化這個activity a ,決定程式是啟動還是退出,隨便弄乙個static型別布林變數控制一下就可以了

一次性備份SQL Server中所有的資料

備份處理的儲存過程 set ansi nulls on set quoted identifier on go 備份所有資料庫 備份的檔名為資料庫名 日期 bak 將所有的使用者資料庫 或指定的資料庫列表 備分到指定的目錄下.呼叫示例 備份所有使用者資料庫 exec p backupdb bkpat...

一次性解決你所有的編碼檢測問題

在日常使用中,我們難以避免會遇到編碼轉換問題。如果編碼是什麼都不知道,請先看 什麼是編碼?而進行編碼轉換的前提是你知道這個字串使用的是什麼編碼。比如你使用 urllib.request.urlopen 獲取乙個網頁時,你特麼如果不知道網頁的編碼會怎樣?直接 read decode 就可能會出現下邊錯...

一次性退出所有activity

可以利用清理歷史棧的方法,來巧妙關閉所有activity,首先用乙個設定為不可見的activity a來啟動程式,這個activity a的作用只是用來墊棧底,只有啟動和退出程式才會用到這個activity,而你需要退出的時候,只需要跳轉至這個activity a 並讓a finish自己就可以實現...