適配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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS13簡單適配iOS
- Flutter監聽路由返回Flutter路由
- 【CoCollider】讓系統和應用適配如此簡單IDE
- 極其簡單的Flutter 螢幕適配Flutter
- Flutter螢幕適配,簡單粗暴的全域性適配方式Flutter
- snap和apt的區別簡單瞭解[]APT
- vue計算屬性 監聽 方法的區別Vue
- web app 中物理返回鍵的監聽WebAPP
- mysql觸發器案例分析以及before和after的區別MySql觸發器
- nginx建立和監聽套接字分析Nginx
- SurfaceView和普通view的區別及簡單使用View
- flutter原始碼系列 PageView原始碼分析以及監聽事件Flutter原始碼View事件
- Android 主流螢幕以及適配Android
- android PopupWindow監聽返回鍵無效Android
- 伺服器IO多路複用的select和poll的區別以及監聽套接字select函式的四個宏操作伺服器函式
- Android適配:DP簡述Android
- 簡單易懂 —— this、self、static 的區別
- iOS多裝置適配簡史以及相應的API支撐實現iOSAPI
- ios11 劉海屏 安全區域 適配 彈框區域適配iOS
- ==和is的區別 以及編碼和解碼
- mybatis collection解析以及和association的區別MyBatis
- js中==和===的區別以及總結JS
- apply 、call 以及 bind 的使用和區別APP
- Flutter多平臺適配機制就是這麼簡單Flutter
- iOS MJRefresh適配ios11以及iPhoneXiOSiPhone
- 關於 WebSocket 和 HTTP 區別的思考以及一個最簡單的 WebSocket 的客戶端和伺服器實現WebHTTP客戶端伺服器
- 對移動端相容適配的分析
- 簡單的RNN和BP多層網路之間的區別RNN
- Android深色模式適配原理分析Android模式
- savedInstanceState和 fragment.setRetainInstance以及 viewmodel的區別FragmentAIView
- ajax和fetch、axios的區別以及axios原理iOS
- Vue3.0的遞迴監聽和非遞迴監聽Vue遞迴
- Python 關於TCP簡介以及與UDP的區別PythonTCPUDP
- Android適配: 拉伸適配的缺點Android
- 異常-throw的概述以及和throws的區別
- go的 & 和 * 的區別,以及應用場景Go
- uniapp打包成apk,監聽安卓手機的返回鍵APPAPK安卓
- H5 頁面適配iPhone X,就是那麼簡單H5iPhone