双屏异显Presentation和Dialog获取LifecycleOwner

1.由于Presentation是基于Dialog的,所以只能通过实现自定义LifecycleOwner

import android.app.Presentation;
import android.content.DialogInterface;

import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;

/**
 * Presentation用生命感知组件
 * <br/>
 * 示例: mMutableLiveData.observe(new PresentationLifeCycleOwner(this), ver -> {...})
 *
 * @author savet
 * @author 2023/6/12
 */
public class PresentationLifeCycleOwner implements LifecycleOwner {
    private DialogInterface.OnDismissListener proxyOnDismissListener;
    private DialogInterface.OnShowListener proxyOnShowListener;
    private final LifecycleRegistry lifecycleRegistry;

    /**
     * 构建一个Presentation的LifeCycleOwner<br/>
     * 注意: <br/>
     * 由于生命感知是通过setOnShowListener和setOnDismissListener来自动设置的 <br/>
     * 所以,如果需要监听这两个状态,则需要通过{@link PresentationLifeCycleOwner#setProxyOnDismissListener}和
     * {@link PresentationLifeCycleOwner#setProxyOnShowListener}来代理监听
     *
     * @param presentation presentation
     */
    public PresentationLifeCycleOwner(Presentation presentation) {
        // 创建
        lifecycleRegistry = new LifecycleRegistry(this);
        lifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);

        // 显示
        presentation.setOnShowListener(dialog -> {
            lifecycleRegistry.setCurrentState(Lifecycle.State.STARTED);
            if (proxyOnShowListener != null) {
                proxyOnShowListener.onShow(dialog);
            }
        });

        // 摧毁
        presentation.setOnDismissListener(dialog -> {
            lifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED);
            if (proxyOnDismissListener != null) {
                proxyOnDismissListener.onDismiss(dialog);
            }
        });

    }

    /**
     * 代理OnDismissListener
     *
     * @param proxyOnDismissListener OnDismissListener
     */
    public void setProxyOnDismissListener(DialogInterface.OnDismissListener proxyOnDismissListener) {
        this.proxyOnDismissListener = proxyOnDismissListener;
    }

    /**
     * 代理OnShowListener
     *
     * @param proxyOnShowListener OnShowListener
     */
    public void setProxyOnShowListener(DialogInterface.OnShowListener proxyOnShowListener) {
        this.proxyOnShowListener = proxyOnShowListener;
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }
}

注:由于Presentation是基于Dialog的,所以这个也可以用于Dialog(把构造函数的Presentation类型修改为Dialog类型即可)

2.使用

在需要使用的地方直接new PresentationLifeCycleOwner(this)来获得即可,如下所示:

mMutableLiveData.observe(new PresentationLifeCycleOwner(this), ver -> {...})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值