android:enableOnBackInvokedCallback="true"
时,需要使用新的返回键拦截API
,原来的
onKeyDown
dispatchKeyEvent
setOnKeyListener
里面的 keyCode == KeyEvent.KEYCODE_BACK
是接收不到的,
要使用
private static class MyOnBackPressedCallback extends OnBackPressedCallback {
private OnMyBackPressedSupport onBackPressedSupport = null;
public MyOnBackPressedCallback(boolean enabled,OnMyBackPressedSupport onBackPressedSupport) {
super(enabled);
this.onBackPressedSupport = onBackPressedSupport;
}
@Override
public void handleOnBackPressed() {
if (onBackPressedSupport != null)
onBackPressedSupport.onBackPresse();
}
}
/**
* 注意, 不能在回调里调用原来 系统函数 onBackPressed() ,会死循环
* @param onBackPressedSupport
*/
public void registerNewOnBackCallback(OnMyBackPressedSupport onBackPressedSupport){
if (!enableNewBackPressed) return;
if (onBackPressedCallback == null)
onBackPressedCallback = new MyOnBackPressedCallback(true, onBackPressedSupport);
onBackPressedCallback.remove();
this.getOnBackPressedDispatcher().addCallback(this,onBackPressedCallback);
}
public void unregisterNewOnBackCallback(){
if (!enableNewBackPressed) return;
if (onBackPressedCallback != null)
onBackPressedCallback.remove();
}
public interface IBackKey {
void onClicked();
}
IBackKey mBackKey;
private void init(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (mBackInvokedCallback == null)
mBackInvokedCallback = new OnBackInvokedCallback() {
@Override
public void onBackInvoked() {
L.d(TAG," dispatchKeyEvent onBackInvoked ");
if (mBackKey != null)
mBackKey.onClicked();
}
};
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (mBackInvokedCallback == null) {
L.d(TAG," mBackInvokedCallback 是 null !!!");
return;
}
android.window.OnBackInvokedDispatcher onBackInvokedDispatcher = findOnBackInvokedDispatcher();
if (onBackInvokedDispatcher != null)
onBackInvokedDispatcher.registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_DEFAULT,
mBackInvokedCallback);
}
}
OnBackInvokedCallback mBackInvokedCallback = null;
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (mBackInvokedCallback == null) {
L.d(TAG," mBackInvokedCallback 是 null !!!");
return;
}
android.window.OnBackInvokedDispatcher onBackInvokedDispatcher = findOnBackInvokedDispatcher();
if (onBackInvokedDispatcher != null)
onBackInvokedDispatcher.unregisterOnBackInvokedCallback(
mBackInvokedCallback);
}
}