onBackPressed、onKeyDown、finish、onDestroy

监听返回键的两种方式:


    // 捕获返回键的方法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();
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值