android笔记之finish()和System.exit(0)

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);
	}
posted @ 2016-10-29 18:39  海的心  阅读(3632)  评论(0编辑  收藏  举报