如何正确的写一个简单的Activity ---- CommonMVVMActivity

600 阅读2分钟

适用范围

当你的页面比较简单,一两百行就能写完时,建议使用CommonMVVMActivity CommonMVVMActivity.java


先看示例代码如下:

package com.okaynaira.android.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.okaynaira.android.R;
import com.okaynaira.android.dao.UserDao;
import com.okaynaira.android.databinding.ActivityTestBinding;
import com.okaynaira.android.model.User;

import leo.work.support.base.activity.mvvm.CommonMVVMActivity;

/**
 * ---------------------------------------------------------------------------------------------
 * 功能描述: 这是一个简单的Activity
 * ---------------------------------------------------------------------------------------------
 * 时  间: 2021/12/20
 * ---------------------------------------------------------------------------------------------
 * 代码创建: 1613-3
 * ---------------------------------------------------------------------------------------------
 * 代码备注: MVC架构,主要用于向大家介绍一个好看的Activity应该怎么写
 * ---------------------------------------------------------------------------------------------
 **/
public class TestActivity extends CommonMVVMActivity<ActivityTestBinding> {

    /*********************
     *     全 局 变 量    *
     *********************/
    private User user;
    ...

    /*********************
     *  生 命 周 期 方 法  *
     *********************/

    @Override
    protected int setLayout() {
        return R.layout.activity_test;
    }

    //初始化数据
    @Override
    protected void initData(Bundle bundle) {
        user = UserDao.getInstance().getUser();
    }

    //初始化View
    @Override
    protected void initViews(Bundle bundle) {
        binding.btnNext.setBackgroundColor(getResources().getColor(R.color.udesk_color_d8d8d8));
    }

    //网络请求
    @Override
    protected void loadData() {
        super.loadData();
    }

    //事件监听
    @Override
    protected void initListener() {
        super.initListener();
        binding.btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                next();
            }
        });
    }

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

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
    
    ...

    /*********************
     *     业 务 方 法    *
     *********************/

    private void next() {

    }
    
    ...
}

CommonMVVMActivity.java

package leo.work.support.base.activity.mvvm;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import android.os.Bundle;

import leo.work.support.support.common.LogUtil;

/**
 * ---------------------------------------------------------------------------------------------
 * 功能描述: 简单的Activity
 * ---------------------------------------------------------------------------------------------
 * 时  间:  2021/4/21
 * ---------------------------------------------------------------------------------------------
 * 代码创建: 刘桂安
 * ---------------------------------------------------------------------------------------------
 * 代码备注:
 * ---------------------------------------------------------------------------------------------
 **/
public abstract class CommonMVVMActivity<T extends ViewDataBinding> extends AppCompatActivity {

    //Activity
    public Activity activity;
    //ViewDataBinding
    public T binding;
    //当前页面是否在前台
    public boolean hasFront = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //打印Log
        LogUtil.e("=======================>" + this.getClass().getName());
        //竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        //
        activity = this;
        //
        binding = DataBindingUtil.setContentView(activity, setLayout());
        //
        initData(savedInstanceState);
        //
        initViews(savedInstanceState);
        //
        loadData();
        //
        initListener();
    }


    protected abstract int setLayout();

    /**
     * 初始化数据
     */
    protected abstract void initData(Bundle savedInstanceState);


    /**
     * 加载View
     *
     * @param savedInstanceState
     */
    protected void initViews(Bundle savedInstanceState) {

    }

    /**
     * 加载数据,如:网络请求
     */
    protected void loadData() {

    }

    /**
     * 初始化监听器
     */
    protected void initListener() {

    }

    /**
     * 使用时应该写在这上面
     * ....
     * super.onResume();
     * 不应该写在super下面
     */
    @Override
    protected void onResume() {
        super.onResume();
        hasFront = true;
    }

    @Override
    protected void onPause() {
        super.onPause();
        hasFront = false;
    }

    /**
     * 设置 app 不随着系统字体的调整而变化
     */
    @Override
    public Resources getResources() {
        Resources resources = super.getResources();
        Configuration config = new Configuration();
        config.setToDefaults();
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        return resources;
    }
}

CommonMVVMActivity主要做了几件事

  • 强制屏幕方向为竖屏
  • 提供ViewDataBinding对象binding,方便开发者快速开发
  • 打印了Log,方便开发者快速通过Log定位Activity
  • 提供Activity对象,开发者不需要再写xxxx.this,this...而是统一使用activity,代码整洁
  • 规定了onCreate方法执行如下四个方法(请注意执行顺序):
    • initData <---- 初始化数据(比如:EventBus注册,从数据库中获取对象与数据,对象构建与赋值等等...)
    • initViews <---- 初始化View(比如设置文字,背景,显示隐藏View等等...)
    • loadData <---- 网络请求,数据加载(比如网络请求等,任何延时获取的数据)
    • initListener <---- 初始化监听事件(比如:点击事件,双击事件,EditText文字监听,广播监听注册等等...)

快速生成Activity的模板

  • 设置方式:

    image.png

    image.png

  • 模板内容:

    #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
    
    import android.os.Bundle;
    
    import com.okaynaira.android.R;
    
    import leo.work.support.base.activity.mvvm.CommonMVVMActivity;
    
    #parse("File Header.java")
    public class ${NAME} extends CommonMVVMActivity<#if (${BINDING_NAME} && ${BINDING_NAME} != "")${BINDING_NAME}#end#if (${BINDING_NAME} && ${BINDING_NAME} == "")Activity(xxxBinding)#end> {
    
        /*********************
         *     全 局 变 量    *
         *********************/
        //.....
    
        /*********************
         *  生 命 周 期 方 法  *
         *********************/
    
        @Override
        protected int setLayout() {
            return R.layout.#if (${LAYOUT_NAME} && ${LAYOUT_NAME} != "")${LAYOUT_NAME}#end#if (${LAYOUT_NAME} && ${LAYOUT_NAME} == "")activity_#end;
        }
    
        @Override
        protected void initData(Bundle bundle) {
    
        }
    
        /*********************
         *     业 务 方 法    *
         *********************/
        //.....
    
    }
    
    

注意点

在Activity开发过程中,请务必按照《Activity开发规范》进行开发。