BaseActivity.java 4.55 KB
package com.sw.laryngoscope.base;

import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewbinding.ViewBinding;

import com.sw.laryngoscope.base.factory.PresenterFactory;
import com.sw.laryngoscope.base.factory.PresenterFactoryImpl;
import com.sw.laryngoscope.base.factory.PresenterProxy;
import com.sw.laryngoscope.base.factory.PresenterProxyImpl;
import com.sw.laryngoscope.utils.Logger;


/**
 * @Description 继承自Activity的基类MvpActivity
 * 使用代理模式来代理Presenter的创建、销毁、绑定、解绑以及Presenter的状态保存,其实就是管理Presenter的生命周期
 * 首先在V层上定义需要创建的Presenter,声明自己模块具体的View接口类型和Presenter类型,最后实现自己View接口就ok了
 * 如果要设置自己的Presenter创建工厂,必须在调用onResume方法和getPresenter方法之前设置
 * @Author
 * @Time 2019/05/29
 */
public abstract class BaseActivity<V extends BaseView, P extends BasePresenter<V>,VB extends ViewBinding>
        extends AppCompatActivity implements BaseView, PresenterProxy<V, P> {

    public String TAG;
    private static final String PRESENTER_SAVE_KEY = "presenter_save_key";

    private PresenterProxyImpl<V, P> mProxyImpl;
    protected VB binding; // ViewBinding 变量
    public View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return true;
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

        super.onCreate(savedInstanceState);
        TAG = getClass().getSimpleName();
        hideBottomUIMenu();
        // 绑定 ViewBinding
        binding = getViewBinding();
        setContentView(binding.getRoot());
        //创建被代理对象,传入默认Presenter的工厂
        mProxyImpl = new PresenterProxyImpl<>(PresenterFactoryImpl.<V, P>createFactory(getClass()));

        if (savedInstanceState != null) {
            mProxyImpl.onRestoreInstanceState(savedInstanceState.getBundle(PRESENTER_SAVE_KEY));
        }

    }

    @Override
    protected void onResume() {
        super.onResume();
        mProxyImpl.onResume((V) this);
    }

    // 让子类提供 ViewBinding 实例
    protected abstract VB getViewBinding();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Logger.e(TAG, "V onDestroy ");
        mProxyImpl.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBundle(PRESENTER_SAVE_KEY, mProxyImpl.onSaveInstanceState());
    }

    @Override
    public void setPresenterFactory(PresenterFactory<V, P> presenterFactory) {
        mProxyImpl.setPresenterFactory(presenterFactory);
    }

    @Override
    public PresenterFactory<V, P> getPresenterFactory() {
        return mProxyImpl.getPresenterFactory();
    }

    @Override
    public P getPresenter() {
        return mProxyImpl.getPresenter();
    }

    private void hideBottomUIMenu() {
        //隐藏虚拟按键,并且全屏
        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

}