Android退出的方法_第1頁
Android退出的方法_第2頁
Android退出的方法_第3頁
Android退出的方法_第4頁
Android退出的方法_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、做android開發(fā)時,發(fā)現(xiàn)一個關(guān)于android退出時不能徹底關(guān)閉的問題,比如:一個程序里new 出了N多個Thread,這樣在退出程序的可能不能完全關(guān)閉,最后發(fā)現(xiàn),只用finish()方法,有時候不能徹底退出,個人感覺還是要在適當?shù)牡胤郊由希篠ystem.exit(0); -前言: finish():結(jié)束當前Activity,不會立即釋放內(nèi)存。遵循android內(nèi)存管理機制。  exit():結(jié)束當前組件如Activity,并立即釋放當前Activity所占資源。  killProcess():結(jié)束當前組件如Activi

2、ty,并立即釋放當前Activity所占資源。  restartPackage():結(jié)束整個App,包括service等其它Activity組件。 1. finish()方法 該方法可以結(jié)束當前Activity,但是如果你的App有很多Activity 的話,使用該方法顯得有點捉襟見肘了。 另外,還有一個方法finishActivity (int requestCode) ,關(guān)于這個方法,先看看sdk的api說明吧!      publ

3、ic voidfinishActivity (int requestCode)    Since: APILevel 1    Force finishanother activity that you had previously started withstartActivityForResult(Intent, int).    P

4、arametersrequestCode The request code of the activity that you had given tostartActivityForResult(). If there are multiple activities started with thisrequest code, they will all b

5、e finished.  也許你會這樣理解 ,Activity1 通過方法startActivityForResult (Intent, int) 啟動Activity2,然后在Activity2 中通過方法finishActivity (intrequestCode)來結(jié)束Activity1,但是很不幸運,不是這樣的。不信你可以Demo一把! 上面文檔說得很明白,該方法強制關(guān)閉通過方法startActivityForResult (Intent, int)啟動的A

6、ctivity,也就是說在Activity1 中的(重寫)方法onActivityResult(intrequestCode, int resultCode, Intent data) 來接收Activity2返回的結(jié)果,必須在Activity1 中調(diào)用finishActivity(int requestCode)來結(jié)束Activity2。(一般在onActivityResult 方法調(diào)用該方法結(jié)束Activity2)。      Force&#

7、160;finishanother activity that you had previously started withstartActivityForResult(Intent, int).    Parameters  還有,下面兩個方法,可以參閱文檔以及源碼研究一下。     finishActivityFromChild(Activity child, int r

8、equestCode)   finishFromChild(Activity child)  2. killProcess 通過調(diào)用android.os.Process 的相關(guān)方法,結(jié)束App,示例如下:     btn_exit.setOnClickListener(new Button.OnClickListener()     Override    

9、public voidonClick(View v)    android.os.Process.killProcess(android.os.Process.myPid();        );  3. exit 我們知道,Java 的exit(int code) 方法可以退出程序,通過查看該方法源碼,知道它實際上是調(diào)用下面的方法:    

10、60;Runtime.getRuntime().exit(code);  示例代碼,如下所示:    btn_exit.setOnClickListener(new Button.OnClickListener()     Override    public voidonClick(View v)    System.exit(0);/正常退出App  &

11、#160;     );  接下來,我們研究一下這個方法。java.lang.System這個類的該方法jdk說明:     exit     public staticvoid exit(int status)    終止當前正在運行的Java 虛擬機。參數(shù)用作狀態(tài)碼;根據(jù)慣例,非0 的狀態(tài)碼表示異常終止。  

12、60; 該方法調(diào)用Runtime 類中的exit 方法。該方法永遠不會正常返回。     調(diào)用System.exit(n) 實際上等效于調(diào)用:    Runtime.getRuntime().exit(n)     參數(shù):    status - 退出狀態(tài)。    拋出:   Securi

13、tyException - 如果安全管理器存在并且其checkExit 方法不允許以指定狀態(tài)退出。    另請參見:   Runtime.exit(int)  也就是說,參數(shù)為非0值的話是異常退出程序。參數(shù)為0的話,就是正常退出。 看RunTime這個類的該方法源碼:     public voidexit(int status)    SecurityMa

14、nager security = System.getSecurityManager();    if (security!= null)    security.checkExit(status);       Shutdown.exit(status);      其api說明:    

15、0;exit     public voidexit(int status)    通過啟動虛擬機的關(guān)閉序列,終止當前正在運行的Java 虛擬機。此方法從不正常返回。可以將變量作為一個狀態(tài)碼;根據(jù)慣例,非零的狀態(tài)碼表示非正常終止。    虛擬機的關(guān)閉序列包含兩個階段。在第一個階段中,會以某種未指定的順序啟動所有已注冊的關(guān)閉鉤子(hook)(如果有的話),并且允許它們同時運行直至結(jié)束。在第二個階段中,如果已啟用退出終結(jié),則運行所有未調(diào)用的

16、終結(jié)方法。一旦完成這個階段,虛擬機就會暫停。     如果在虛擬機已開始其關(guān)閉序列后才調(diào)用此方法,那么若正在運行關(guān)閉鉤子,則將無限期地阻斷此方法。如果已經(jīng)運行完關(guān)閉鉤子,并且已啟用退出終結(jié)(on-exit finalization),那么此方法將利用給定的狀態(tài)碼(如果狀態(tài)碼是非零值)暫停虛擬機;否則將無限期地阻斷虛擬機。     System.exit 方法是調(diào)用此方法的一種傳統(tǒng)而便捷的方式。     參數(shù): 

17、60;  status - 終止狀態(tài)。按照慣例,非零的狀態(tài)碼表明非正常終止。    拋出:   SecurityException - 如果安全管理器存在,并且其checkExit 方法不允許存在指定的狀態(tài)    另請參見:   SecurityException, SecurityManager.checkExit(int),addShutdownHook(java.lang

18、.Thread), removeShutdownHook(java.lang.Thread),runFinalizersOnExit(boolean), halt(int)  該方法又是調(diào)用Shutdown這個類的exit()方法。     static voidexit(int status)     booleanrunMoreFinalizers = false;    

19、synchronized(lock)     if (status !=0) runFinalizersOnExit = false;    switch (state)    case RUNNING:/* Initiate shutdown */    state = HOOKS;  

20、  break;    case HOOKS: /*Stall and halt */    break;    caseFINALIZERS:    if (status !=0)     /* Haltimmediately on nonzero stat

21、us */    halt(status);     else     /*Compatibility with old behavior:    * Run morefinalizers and then halt    */   runMoreFinali

22、zers = runFinalizersOnExit;        break;            if(runMoreFinalizers)    runAllFinalizers();    halt(status);      

23、  synchronized(Shutdown.class)     /* Synchronizeon the class object, causing any other thread    * thatattempts to initiate shutdown to stall indefinitely  

24、60; */    sequence();    halt(status);          其中,runAllFinalizers()是一個本地方法:     JNIEXPORT voidJNICALL   Java_java_lang_Shutdown_runAllFinalizers(JNIEnv *

25、env, jclass ignored)        jclass cl;    jmethodID mid;     if (cl =(*env)->FindClass(env, "java/lang/ref/Finalizer")    &&(mid =

26、0;(*env)->GetStaticMethodID(env, cl,   "runAllFinalizers", "()V")    (*env)->CallStaticVoidMethod(env, cl, mid);          System.exit()的參數(shù)是把退出原因返回給系統(tǒng), 一般來說可以是任何的整數(shù)&

27、#160;。 0表示正常退出,1表示非正常 。 最后說一下finish()與exit方法的區(qū)別: finish()是Activity的類方法,僅僅針對Activity,當調(diào)用finish()時,只是將活動推向后臺,并沒有立即釋放內(nèi)存,活動的資源并沒有被清理;當調(diào)用System.exit(0)時,退出當前Activity并釋放資源(內(nèi)存),但是該方法不可以結(jié)束整個App如有多個Activty或者有其他組件service等不會結(jié)束。 其實android的機制決定了用戶無法完全退出應(yīng)用,當你的application最長時間沒有被用過的時候,andro

28、id自身會決定將application關(guān)閉了。4. restartPackage方法    ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);   manager.restartPackage(getPackageName();  首先需要創(chuàng)建ActivityManager對象,然后調(diào)用restartPackage()方法(如果有興趣的話,可以看

29、源碼)。 注意:getPackageName獲得當前應(yīng)用包名稱,如mark.zhang 使用這種方式來退出App,需要權(quán)限:    <uses-permissionandroid:name="android.permission.RESTART_PACKAGES" />  更加詳細的說明,如下:     voidandroid.app.ActivityManager.restartPackage(String pa

30、ckageName)     Have thesystem perform a force stop of everything associated with the given applicationpackage. All processes that share its uid will be killed, all&#

31、160;services it hasrunning stopped, all activities removed, etc. In addition, aIntent.ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of itsregistered alarms can be stopped

32、, notifications removed, etc.     You must holdthe permission android.Manifest.permission.RESTART_PACKAGES to be able to callthis method.     Parameters:    packageN

33、ameThe name of the package to be stopped.  可以看出,相同的UID的進程會被kill,還會停止相關(guān)的服務(wù)以及移除所有的Activity,并且會發(fā)送一個廣播。  注意一個問題:在android2.2之后,該方法不可以將應(yīng)用程序結(jié)束,需要使用ActivityManager類的下面這個方法:     public voidkillBackgroundProcesses (Strin

34、g packageName)  api 文檔說的很清楚:     public voidrestartPackage (String packageName)     Since: APILevel 3    This method isdeprecated.    This is now

35、just a wrapper for killBackgroundProcesses(String); the previous behavior hereis no longer available to applications because it allows them to break otherapplications by removing their alarms, stopping their services, etc.  另外,需要使用權(quán)限:    <uses-permissionandroid:name="android.permission.KILL_BACKGROUND_PROCESSES"/>  但是不管你怎么樣折騰,還是無法退出App,嗚呼哀哉!這里給出一個方法:    

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論