適配target30返回監聽以及簡單分析finish()和onBackPressed()的區別
首先在target29之前,我們要對使用者返回的操作進行監聽,一般是這樣的
// 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iPhone X和iOS 11的簡單適配iPhoneiOS
- iOS13簡單適配iOS
- iPhoneX簡單適配iPhone
- iOS10 CAAnimationDelegate 的簡單適配iOS
- 【監聽】兩庫互配靜態監聽
- Flutter監聽路由返回Flutter路由
- 極其簡單的Flutter 螢幕適配Flutter
- Maven和Ant簡介以及兩者的區別Maven
- cocos2d-x監聽android的選單和返回按鈕Android
- Flutter螢幕適配,簡單粗暴的全域性適配方式Flutter
- oracle 多庫配監聽Oracle
- RAC中lsnrctl和srvctl的區別(監聽狀態異常)
- Android Service 服務的應用之電話監聽器以及簡訊監聽器Android
- 【CoCollider】讓系統和應用適配如此簡單IDE
- Android開發 返回鍵的複寫 onBackPressed()Android
- URL和URI的區別簡單介紹
- 簡單介紹 "&&" 與 “&” 和 ”|“ 與 ”||“ 的區別
- snap和apt的區別簡單瞭解[]APT
- vue計算屬性 監聽 方法的區別Vue
- web app 中物理返回鍵的監聽WebAPP
- nginx建立和監聽套接字分析Nginx
- SurfaceView和普通view的區別及簡單使用View
- 簡單工廠和抽象工廠的區別抽象
- Widget的簡單應用並適配iOS10iOS
- flutter原始碼系列 PageView原始碼分析以及監聽事件Flutter原始碼View事件
- ios11 劉海屏 安全區域 適配 彈框區域適配iOS
- Android 主流螢幕以及適配Android
- mysql觸發器案例分析以及before和after的區別MySql觸發器
- 網頁適配 iPhoneX,就是這麼簡單網頁iPhone
- closest()、parents()和parent()方法的區別簡單介紹
- android PopupWindow監聽返回鍵無效Android
- ORACLE監聽簡介Oracle
- iOS多裝置適配簡史以及相應的API支撐實現iOSAPI
- 簡單易懂 —— this、self、static 的區別
- JS的平凡之路--模仿Vue寫個簡單的物件監聽JSVue物件
- 動態監聽和靜態監聽
- Flutter多平臺適配機制就是這麼簡單Flutter
- js中==和===的區別以及總結JS