前文
在创建App页面的时候,我们会创建一个Activity.
Activity的启动流程是:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy.
我们新创建的Activity会去重写这几个方法,尤其是在onCreate()方法里去初始化控件、获取数据等。
系统的Activity其实就使用了模版方法模式,启动流程的那几个方法是每个Activity都需要的,所以处理成了模版方法。
本篇文章就是,通过模版方法设计模式,构建一个BaseActivity,以便将来创建新Activity的时候更方便,有一个良好的代码结构。
正文:
一、在baselibrary module下创建BaseActivity
BaseActivity继承自AppCompatActivity
package com.example.baselibrary.base;
import android.content.Intent;
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 com.example.baselibrary.ioc.ViewUtils;
/**
* @Name:EassyJoke
* @Description:activity基类
* @Author:jingyil
* @Date:2/14/23 8:47 PM:
* 把一些通用的功能放进来
* 两个和两个以上的地方,使用一个工具类
*/
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置布局layout
setContentView(initLayout());
ViewUtils.inject(this);
//初始化布局
initView();
//初始化数据
initData();
}
//protected 包内、子类可见
protected abstract int initLayout();
protected abstract void initView();
protected abstract void initData();
}
我们在BaseActivity创建了三个被保护的抽象方法
修饰符protected : 同一个包中的类、子类可见
同一个包:就是.java文件中的第一行package要一致
这三个抽象方法是:
1.initLayout():设置页面的布局layout id , 传到setContentView()的id。
2.initView():初始化View控件,实例化view。
3.initData():初始化数据,网络拉取数据等。
二、添加一些其他的常用方法
package com.example.baselibrary.base;
import android.content.Intent;
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 com.example.baselibrary.ioc.ViewUtils;
/**
* @Name:EassyJoke
* @Description:activity基类
* @Author:jingyil
* @Date:2/14/23 8:47 PM:
* 把一些通用的功能放进来
* 两个和两个以上的地方,使用一个工具类
*/
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置布局layout
setContentView(initLayout());
ViewUtils.inject(this);
//初始化布局
initView();
//初始化数据
initData();
}
//protected 包内、子类可见
protected abstract int initLayout();
protected abstract void initView();
protected abstract void initData();
//防止连续点击的监听器,一秒钟
public abstract class OnSingleClickListener implements View.OnClickListener {
private final static int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime;
public abstract void onSingleClick();
@Override
public void onClick(View v) {
long currentClick = System.currentTimeMillis();
if (currentClick - lastClickTime > 1000) {
lastClickTime = currentClick;
onSingleClick();
}
}
}
//启动activity
protected void startActivity(Class<?> clazz) {
Intent intent = new Intent(this, clazz);
startActivity(intent);
}
//findViewById省去强转
protected <T extends View> T viewById(int id) {
return (T)findViewById(id);
}
}
1.提供一个防止连续点击的监听器,常用的功能。
//防止连续点击的监听器,一秒钟
public abstract class OnSingleClickListener implements View.OnClickListener {
private final static int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime;
public abstract void onSingleClick();
@Override
public void onClick(View v) {
long currentClick = System.currentTimeMillis();
if (currentClick - lastClickTime > 1000) {
lastClickTime = currentClick;
onSingleClick();
}
}
}
OnSingleClickListener继承View.OnClickListener
重写View.OnClickListener的onClick()方法
在onclick方法里再调用抽象方法onSingleClick()
2.提供一个启动其他Activity的方法,避免再去手动写Intent
//启动activity
protected void startActivity(Class<?> clazz) {
Intent intent = new Intent(this, clazz);
startActivity(intent);
}
3.提供一个更方便的findViewById方法,用泛型省去了类型转换
protected <T extends View> T viewById(int id) {
return (T)findViewById(id);
}
三、实际使用案例
package com.example.eassyjoke;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.baselibrary.base.BaseSkinActivity;
import com.example.baselibrary.ioc.OnClick;
import com.example.baselibrary.ioc.ViewById;
import com.example.baselibrary.ioc.ViewUtils;
public class MainActivity extends BaseSkinActivity {
@ViewById(R.id.text_tv)
private TextView textView;
@ViewById(R.id.text_new_tv)
private TextView textNewView;
int clickNum = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected int initLayout() {
return R.layout.activity_main;
}
@Override
protected void initView() {
textView.setText("Inject Test");
textNewView.setText("New Text");
textNewView.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick() {
clickNum++;
Toast.makeText(MainActivity.this, "click num is " + clickNum, Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void initData() {
}
@OnClick({R.id.text_tv})
private void onClick(View view) {
Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
}
}