Android程序完全退出的幾種方法
很多網(wǎng)友可能發(fā)現(xiàn)自己的Android程序有很多Activity,比如說主窗口A冰寻,調(diào)用了子窗口B,在B中如何關(guān)閉整個(gè)Android應(yīng)用程序呢? 這里Android123給大家三種比較簡單的方法實(shí)現(xiàn)开呐。
首先要說明在B中直接使用finish()序臂,接下來手機(jī)顯示的還是主窗口A,所以一起來看看Android開發(fā)網(wǎng)是如何實(shí)現(xiàn)的吧.
1.? ? ? ? Dalvik VM的本地方法
android.os.Process.killProcess(android.os.Process.myPid())? ? //獲取PID稿壁,目前獲取自己的也只有該API幽钢,否則從/proc中自己的枚舉其他進(jìn)程吧,不過要說明的是傅是,結(jié)束其他進(jìn)程不一定有權(quán)限匪燕,不然就亂套了蕾羊。
System.exit(0);? //常規(guī)java、c#的標(biāo)準(zhǔn)退出法帽驯,返回值為0代表正常退出
2.? ? ? ? 任務(wù)管理器方法
首先要說明該方法運(yùn)行在Android 1.5 API Level為3以上才可以龟再,同時(shí)需要權(quán)限android.permission.RESTART_PACKAGES,我們直接結(jié)束自己的package即可尼变,直接使用ActivityManager類的restartPackage方法即可利凑,參數(shù)為package name,該類通過getSystemService(Context.ACTIVITY_SERVICE)來實(shí)例化ActivityManager對(duì)象嫌术,這種方法系統(tǒng)提供的哀澈,但需要顯示聲明權(quán)限,所以使用中需要綜合考慮度气。
3.? ? ? ? 根據(jù)Activity的聲明周期
我們知道Android的窗口類提供了歷史棧日丹,我們可以通過stack的原理來巧妙的實(shí)現(xiàn),這里我們?cè)贏窗口打開B窗口時(shí)在Intent中直接加入標(biāo)志Intent.FLAG_ACTIVITY_CLEAR_TOP蚯嫌,這樣開啟B時(shí)將會(huì)清除該進(jìn)程空間的所有Activity。
在A窗口中使用下面的代碼調(diào)用B窗口
Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);? //注意本行的FLAG設(shè)置
startActivity(intent);
4.? ? ? ? killBackgroundProcesses方法
在Android 2.2中新增了一個(gè)API可以幫助我們殺死后臺(tái)進(jìn)程丙躏,不過Android123再次強(qiáng)調(diào)其調(diào)用的API Level最小為8择示,killBackgroundProcesses是android.app.ActivityManager類的方法,使用時(shí)必須在androidmanifest.xml文件中加入KILL_BACKGROUND_PROCESSES這個(gè)權(quán)限晒旅。雖然本類還提供了restartPackage (String packageName) 方法調(diào)用的API Level為3栅盲,但是SDK中已經(jīng)標(biāo)記為deprecated离唐,其實(shí)他們的原理都是一樣的晰赞,只不過過去Google的命名方式確實(shí)不是很合理,restartPackage的作用很難讓我們聯(lián)想到是結(jié)束進(jìn)程或杠。
該方法的原型 public void killBackgroundProcesses (String packageName)? 僅有一個(gè)參數(shù)為package Name鱼鼓,使用方法比較簡單拟烫。
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses("cn.com.android123.cwj");? // API Level至少為8才能使用
5.? ? ? ? Dalvik VM
首先我們可以制造一個(gè)空指針的異常,比如TextView.setText方法中執(zhí)行一個(gè)int型的內(nèi)容迄本,由于setText方法重載了R.string.xxx這樣的資源int型內(nèi)容硕淑,但是我們沒有聲明這個(gè)資源,僅僅把String寫成了int的值嘉赎,就會(huì)產(chǎn)生一個(gè)異常置媳,這時(shí)系統(tǒng)Dalvik VM會(huì)直接關(guān)閉你的進(jìn)程,這招十分有效公条,CWJ一般平時(shí)不公布給大家拇囊。
6.? ? ? ? Thread.UncaughtExceptionHandler
但是有的網(wǎng)友說了,有Force Close的對(duì)話框怎么辦靶橱,其實(shí)我們通過重寫Android應(yīng)用程序的Application基類自己實(shí)現(xiàn)Thread.UncaughtExceptionHandler接口的uncaughtException方法是可以避免出現(xiàn)FC窗口的寥袭,用戶感覺直接退出了一樣
http://bbs.droidstouch.com/thread-1074-1-2.html