finish方法用於結束當前的activity,程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實例可以被“回收”。隨后 Activity Manager 激活處於棧第二層的 Activity 並重 新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態轉到 Paused 狀態。通過研究finish()源碼,
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]。
@Override public void onBackPressed() {//重寫onBackPressed()方法 Log.i(TAG, "onBackPressed"); setResult(Const.LIVE_OK); super.onBackPressed(); }
5、finish()和System.exit(0);
finish是Activity的類,僅僅針對Activity,當調用finish()時,只是將活動推向后台,並沒有立即釋放內存,活動的資源並沒有被清理;當調用System.exit(0)時,殺死了整個進程,這時候活動所占的資源才會被釋放。這也就可以解釋,在很多android應用中,用戶通過按返回鍵或home鍵就直接關閉了應用程序,回到了桌面。但該應用的后台程序仍在運行。解決方案是添加自定義的退出按鈕后捕獲返回鍵。下面就做一個捕獲返回鍵的簡單實例。
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); }