android14,返回键拦截

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);
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容