监听返回键的两种方式:
// 捕获返回键的方法1
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
// 按下BACK,同时没有重复
Log.d(TAG, "onKeyDown()");
}
return super.onKeyDown(keyCode, event);
}
// 捕获返回键的方法2
@Override
public void onBackPressed() {
Log.d(TAG, "onBackPressed()");
super.onBackPressed();
}
onBackPressed与onKeyDown区别:
相同点:
最终都会调用finish方法
不同点:
onBackPressed适用于api小于5(Android2.0),且按back键,无重复
onKeyDown适用于Android2.0或更新版的sdk
onBackPressed与finish区别:
如果使用onBackPressed(),假如你的Activity有添加管理frgament回退的话,调用该方法是不会退出Activity的.直到Fragment回退栈清空,才会退出Activity。
如果使用finish(),那么就会直接退出Activity。
Activity中finish() onDestroy() 和System.exit()的区别
Activity.finish()
Call this when your activity is done and should be closed.
在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。
当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。
因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity。
Activity.onDestory()
the system is temporarily destroying this instance of the activity to save space.
系统销毁了这个Activity的实例在内存中占据的空间。
在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间等就被回收了。当重新进入此Activity的时候,必须重新创建,执行onCreate()方法。
System.exit(0)
这玩意是退出整个应用程序的,是针对整个Application的。将整个进程直接KO掉。
finish函数仅仅把当前Activity退出了,但是并没有释放他的资源。
安卓系统自己决定何时从内存中释放应用程序。
当系统没有可用内存到时候,会按照优先级,释放部分应用。
源码探索:
1 点击 super.onKeyDown(keyCode, event);
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(VERSION.SDK_INT < 5 && keyCode == 4 && event.getRepeatCount() == 0) {
//onBackPressed适用于api小于5(Android2.0),且按back键,无重复
this.onBackPressed();
return true;
} else {//onKeyDown适用于Android2.0或更新版的sdk
return super.onKeyDown(keyCode, event);
}
}
1.1 点击查看 this.onBackPressed();方法:
public void onBackPressed() {
if(!this.mFragments.getSupportFragmentManager().popBackStackImmediate()) {
this.supportFinishAfterTransition();
}
}
1.1.1 点击this.supportFinishAfterTransition();方法
public void supportFinishAfterTransition() {
ActivityCompat.finishAfterTransition(this);
}
1.1.1.1 点击ActivityCompat.finishAfterTransition(this);方法
public static void finishAfterTransition(Activity activity) {
if(VERSION.SDK_INT >= 21) {//api大于等于21
ActivityCompat21.finishAfterTransition(activity);
} else {
activity.finish();
}
}
1.1.1.1.1 点击ActivityCompat21.finishAfterTransition(activity);方法
public static void finishAfterTransition(Activity activity) {
activity.finishAfterTransition();
}
1.1.1.1.1.1 点击activity.finishAfterTransition();方法
public void finishAfterTransition() {
if (!mActivityTransitionState.startExitBackTransition(this)) {
finish();
}
}