android筆記之finish()和System.exit(0)

finish方法用於結束當前的activity,程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵同樣:他告訴 Activity Manager該Activity實例能夠被「回收」。隨後 Activity Manager 激活處於棧第二層的 Activity 並重 新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態轉到 Paused 狀態。經過研究finish()源碼,html

 

 public void finish() {
        if (mParent == null) {
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
            try {
                if (resultData != null) {
                    resultData.setAllowFds(false);
                }
                if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }

 

也能夠知道activity返回result是在被finish()方法裏面完成的。使用this.finish()也就能夠實現Android按鈕返回效果(同按BACK返回鍵同樣);自定義一個按鈕,在OnClick方法中加入當前activity名.this.finish();結束當前的activity,返回到上一個activity。但按BACK鍵從一個Activity退出來,一按BACK,android就會自動調用Activity的finish()方法,而後設置resultCode爲RESULT_CANCELED,也就不會返回任何數據了,解決方法就是在Activity裏面捕獲按BACK的事件,捕獲到以後先setResult,而後本身來調用finish.捕獲按返回鍵能夠直接重寫onBackPressed()方法,也能夠重寫onKeyDown()方法監聽物理鍵事件[keyCode == KeyEvent.KEYCODE_BACK]。android

@Override
    public void onBackPressed() {//重寫onBackPressed()方法
        Log.i(TAG, "onBackPressed");
        setResult(Const.LIVE_OK);
        super.onBackPressed();
    }

五、finish()和System.exit(0);
finish是Activity的類,僅僅針對Activity,當調用finish()時,只是將活動推向後臺,並無當即釋放內存,活動的資源並無被清理;當調用System.exit(0)時,殺死了整個進程,這時候活動所佔的資源纔會被釋放。這也就能夠解釋,在不少android應用中,用戶經過按返回鍵或home鍵就直接關閉了應用程序,回到了桌面。但該應用的後臺程序仍在運行。解決方案是添加自定義的退出按鈕後捕獲返回鍵。下面就作一個捕獲返回鍵的簡單實例。ide

 

    private long exitTime = 0;
	@Override  
    public boolean onKeyDown(int keyCode, KeyEvent event){  
		if (keyCode == KeyEvent.KEYCODE_BACK
				&& 
		   event.getAction() == KeyEvent.ACTION_DOWN) {
		   if ((System.currentTimeMillis() - exitTime) > 2000) {
				Toast.makeText(getApplicationContext(), "再按一次返回鍵退出程序",
						Toast.LENGTH_SHORT).show();
				exitTime = System.currentTimeMillis();
		   } else {			 
			   //作一些最後的清理工做
			   finish();
			   System.exit(0);//結束整個進程
		   }
		   return true;
		}
		return super.onKeyDown(keyCode, event);
	}
相關文章
相關標籤/搜索