在 Android 开发中,基类(Base Classes)是提高开发效率、减少重复代码的重要手段。以下是 BaseActivity、BaseFragment 和 BaseApplication 的实现,涵盖了常用功能,如生命周期管理、Toast 提示、权限处理、Fragment 管理等。
- BaseApplication
BaseApplication 是应用的全局基类,用于初始化全局配置、工具类等。
import android.app.Application;
import android.content.Context;
public class BaseApplication extends Application {
private static BaseApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
// 在这里初始化全局配置
initGlobalConfig();
}
// 获取 Application 实例
public static BaseApplication getInstance() {
return instance;
}
// 获取全局 Context
public static Context getContext() {
return instance.getApplicationContext();
}
// 初始化全局配置
private void initGlobalConfig() {
// 例如:初始化日志工具、网络库、数据库等
}
}
- BaseActivity
BaseActivity 是所有 Activity 的基类,封装了常用功能,如 Toast、权限处理、Fragment 管理等
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置布局
setContentView(getLayoutId());
// 初始化视图
initView();
// 初始化数据
initData();
}
// 获取布局 ID
protected abstract int getLayoutId();
// 初始化视图
protected abstract void initView();
// 初始化数据
protected abstract void initData();
// 显示 Toast
protected void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
// 检查权限
protected boolean hasPermission(String permission) {
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
}
// 请求权限
protected void requestPermission(String permission, int requestCode) {
ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted(requestCode);
} else {
onPermissionDenied(requestCode);
}
}
// 权限授予
protected void onPermissionGranted(int requestCode) {
// 子类可重写
}
// 权限拒绝
protected void onPermissionDenied(int requestCode) {
// 子类可重写
}
// 添加 Fragment
protected void addFragment(int containerId, Fragment fragment, String tag) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.add(containerId, fragment, tag);
transaction.commit();
}
// 替换 Fragment
protected void replaceFragment(int containerId, Fragment fragment, String tag) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(containerId, fragment, tag);
transaction.commit();
}
// 移除 Fragment
protected void removeFragment(Fragment fragment) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(fragment);
transaction.commit();
}
}
- BaseFragment
BaseFragment 是所有 Fragment 的基类,封装了常用功能,如 Toast、懒加载等。
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public abstract class BaseFragment extends Fragment {
private boolean isViewCreated = false; // 视图是否已创建
private boolean isDataLoaded = false; // 数据是否已加载
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutId(), container, false);
initView(view);
isViewCreated = true;
tryLoadData();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
isViewCreated = false;
isDataLoaded = false;
}
// 获取布局 ID
protected abstract int getLayoutId();
// 初始化视图
protected abstract void initView(View view);
// 初始化数据
protected abstract void initData();
// 显示 Toast
protected void showToast(String message) {
Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
}
// 懒加载数据
private void tryLoadData() {
if (isViewCreated && getUserVisibleHint() && !isDataLoaded) {
initData();
isDataLoaded = true;
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
tryLoadData();
}
}
- 使用示例
4.1 继承 BaseActivity:
public class MainActivity extends BaseActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initView() {
// 初始化视图
}
@Override
protected void initData() {
// 初始化数据
}
}
4.2 继承 BaseFragment
public class HomeFragment extends BaseFragment {
@Override
protected int getLayoutId() {
return R.layout.fragment_home;
}
@Override
protected void initView(View view) {
// 初始化视图
}
@Override
protected void initData() {
// 初始化数据
}
}
- 总结
BaseApplication:用于全局配置和工具类初始化。
BaseActivity:封装了 Toast、权限处理、Fragment 管理等常用功能。
BaseFragment:支持懒加载,封装了 Toast 等功能。
通过基类的封装,可以减少重复代码,提高开发效率,同时使代码更易于维护和扩展。