android 退出應用程序因為,android Activity的特殊性,導致想要完整的關(guān)閉一個(gè)由多個(gè)activity組成的應用程序是非常困難的,如果,activity調用方式錯綜復雜,那就更難完整的關(guān)閉了。以我的理解,在android里一個(gè)Activity就等同于一個(gè)獨立的應用程序,所以,即便你認為幾個(gè)Activity合起來(lái)才算是一個(gè)整體的應用程序,但android不會(huì )這么認為。所以,你會(huì )發(fā)現使用System.exit(0);來(lái)關(guān)閉應用程序,只會(huì )關(guān)閉當前顯示的Activity,不會(huì )關(guān)閉所有的Activity。
我看了一些帖子,他們說(shuō)設計一個(gè)應用程序時(shí),最好由一個(gè)Activity調用所有的Activity,不要嵌套的調用。
下面給出關(guān)閉Activity的兩種方法。
1). System.exit(0);
2). android.os.Process.killProcess(android.os.Process.myPid());
以上只是個(gè)人觀(guān)點(diǎn),在這次做項目時(shí)得出的一些結論,可能不太準確,還待修改。
在開(kāi)發(fā)一個(gè)android應用軟件時(shí),考慮如何關(guān)閉應用程序的問(wèn)題。一開(kāi)始采用當前Activity調用finish()來(lái)完成,但這種做法是不對的。 這幾天通過(guò)閱讀Android的frameworks層代碼時(shí),發(fā)現平臺提供了關(guān)閉程序的方法。 在ActivityManager類(lèi)中提供了如下的方法:
如下:
/**
* Have the system perform a force stop of everything associated with
* the given application package. All processes that share its uid
* will be killed, all services it has running stopped, all activities
* removed, etc. In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED}
* broadcast will be sent, so that any of its registered alarms can * be stopped, notifications removed, etc.
*
* You must hold the permission * {@link android.Manifest.permission#RESTART_PACKAGES} to be able to
* call this method.
*
* @param packageName The name of the package to be stopped.
*/
public void restartPackage(String packageName) {
try {
ActivityManagerNative.getDefault().restartPackage(packageName);
} catch (RemoteException e) { } }
ok,我們只需要取得ActivityManager的實(shí)例,并調用該方法即可正常關(guān)閉應用。 以下是關(guān)閉程序的代碼片段:
private void exit2() {
ActivityManager actMgr = (ActivityManager) this .getSystemService(ACTIVITY_SERVICE);
actMgr.restartPackage(getPackageName()); }
調用上述方法就能徹底地關(guān)閉掉程序,一般僅僅調用finish()是無(wú)法徹底關(guān)閉程序的。 但要注意一點(diǎn),調用系統服務(wù)需要在AndroidManifest.xml文件中增加權限。SDK2.1后就被廢棄了,因為這個(gè)方法會(huì )關(guān)閉同其他應用程序共享的Service,
1.int version = android.os.Build.VERSION.SDK_INT;
ActivityManager activityMgr = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
if (version <= 7) {
activityMgr.restartPackage(mContext.getPackageName());
} else {
mContext.stopService(new Intent(mContext, MusicService.class));
// activityMgr.killBackgroundProcesses(mContext.getPackageName());
//需要權限KILL_BACKGROUND_PROCESSES
android.os.Process.killProcess(pid);
}
2.int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid); //殺死當前進(jìn)程
3.this.finish() thisà當前activity //殺死當前進(jìn)程
首先要說(shuō)明在B中直接使用finish(),接下來(lái)手機顯示的還是主窗口A,所以一起來(lái)看看Android開(kāi)發(fā)網(wǎng)是如何實(shí)現的吧.
1. Dalvik VM的本地方法
android.os.Process.killProcess(android.os.Process.myPid()) //獲取PID,目前獲取自己的也只有該API,否則從/proc中自己的枚舉其他進(jìn)程吧,不過(guò)要說(shuō)明的是,結束其他進(jìn)程不一定有權限,不然就亂套了。
System.exit(0); //常規java、c#的標準退出法,返回值為0代表正常退出
2. 任務(wù)管理器方法
首先要說(shuō)明該方法運行在Android 1.5 API Level為3以上才可以,同時(shí)需要權限android.permission.RESTART_PACKAGES,我們直接結束自己的package即可,直接使用ActivityManager類(lèi)的restartPackage方法即可,參數為package name,該類(lèi)通過(guò)getSystemService(Context.ACTIVITY_SERVICE)來(lái)實(shí)例化ActivityManager對象,這種方法系統提供的,但需要顯示聲明權限,所以使用中需要綜合考慮。
3. 根據Activity的聲明周期
我們知道Android的窗口類(lèi)提供了歷史棧,我們可以通過(guò)stack的原理來(lái)巧妙的實(shí)現,這里我們在A窗口打開(kāi)B窗口時(shí)在Intent中直接加入標志Intent.FLAG_ACTIVITY_CLEAR_TOP,這樣開(kāi)啟B時(shí)將會(huì )清除該進(jìn)程空間的所有Activity。
在A窗口中使用下面的代碼調用B窗口 //返回Home界面,貌似可行。
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(0);
首先要說(shuō)明在B中直接使用finish(),接下來(lái)手機顯示的還是主窗口A,所以一起來(lái)看看Android開(kāi)發(fā)網(wǎng)是如何實(shí)現的吧.
4:自己寫(xiě)一個(gè)Application,在內部自己管理Acitvity,與版本無(wú)關(guān),絕對可以。