適配target30返回監聽以及簡單分析finish()和onBackPressed()的區別

山有木xi發表於2023-12-16

首先在target29之前,我們要對使用者返回的操作進行監聽,一般是這樣的

override fun onBackPressed() {
    // and so on..
}

然後在裡面做自己的相關邏輯,但是升級 target之後,這一套操作就無效了

解決方案是,如果只需要呼叫backPresed(),可以使用onBackPressedDispatcher.onBackPressed()替代

如果需要監聽返回,那麼就可以這樣做

private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        backPressed()
    }
}
override fun initEvent() {
    onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
}


其中 backPressed方法是自己定義的,我們可以在裡面做自己想要做的操作,適配就到此結束了


然後我突然在想,onBackPressed和finish好像都是退出頁面,為什麼有些地方退出會用到onBackPressed呢,查了下資料發現,還是有區別的

  • finish(),會直接關閉當前Activity

  • onBackPressed(),是系統返回的操作

聽起來可能沒什麼區別,舉個例子就很清晰了,當我們頁面有popupWindow被喚醒時,呼叫onBackPressed會將popupWindow銷燬,而呼叫finish會直接退出Activity

如果頁面沒有什麼東西可以後退時,兩者是一樣的,這一點從原始碼來看也很清楚

private void finish(int finishTask) {
        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.prepareToLeaveProcess(this);
                }
                if (ActivityManagerNative.getDefault()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }

(finish())

而onBackPressed裡面會先判斷是否有彈窗、選單

public void onBackPressed() {
        if (mActionBar != null && mActionBar.collapseActionView()) {
            return;
        }
 
        if (!mFragments.getFragmentManager().popBackStackImmediate()) {
            finishAfterTransition();
        }
    }

當然,走到最後,還是走到finish的邏輯

public void finishAfterTransition() {
        if (!mActivityTransitionState.startExitBackTransition(this)) {
            finish();
        }
    }


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/69917874/viewspace-3000372/,如需轉載,請註明出處,否則將追究法律責任。

相關文章