轉自:http://chenzoudgh.blog.163.com/blog/static/149868996201011143483180/
有幾個activity,有一需求是在一個activityA點擊back鍵退出系統而不是跳到之前的activity 首先想到的是清空activityA的堆棧,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 但是該activityA不是已經存在於堆棧底端的,所以清除的只是堆棧中該activityA上面的activity,但後退後還是會返回堆棧中該activityA下面的activity。 然後想到的是截獲back按鍵的事件,使用System.exit(0)和android.os.Process.killProcess(android.os.Process.myPid())來退出程式,還是不行,當前的activityA是被幹掉了,但是還是會被ActivityManager接管返回到前一個activity。而且如果之前activity需要一些傳過來的參數的話會導致程式連續拋異常。 最後終於找到一個可行的方法:使用ActivityManager徹底退出程式ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); manager.restartPackage(getPackageName()); 需要聲明許可權<uses-permission android:name="android.permission.RESTART_PACKAGES"/>這種方法會終止一切和這個程式包關聯的,所有共用同一uid的process被kill,所有的activity會被removed所有建立的服務會停止,還會發一個廣播
Intent.ACTION_PACKAGE_RESTARTED導致所有註冊alarms 被stopped, notifications 被removed。 這幾天刷了2.2的rom發現restartPackage方法無效,網上搜了下答案: 在Android 2.2中新增了一個API可以協助我們殺死後台進程,不過Android123再次強調其調用的API Level最小為8,killBackgroundProcesses是android.app.ActivityManager類的方法,使用時必須在androidmanifest.xml檔案中加入KILL_BACKGROUND_PROCESSES這個許可權。雖然本類還提供了restartPackage (String packageName) 方法調用的API Level為3,但是SDK中已經標記為deprecated,其實他們的原理都是一樣的,只不過過去Google的命名方式確實不是很合理,restartPackage的作用很難讓我們聯想到是結束進程。
該方法的原型 public void killBackgroundProcesses (String packageName) 僅有一個參數為package Name,使用方法比較簡
單。
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses("cn.com.android123.cwj"); // API Level至少為8才能使用
所以要用此方法最好加個判斷如果是2.2之前的rom就用restartPackage之後的就用killBackgroundProcesses