370 lines
12 KiB
Java
370 lines
12 KiB
Java
package com.xscm.moduleutil.activity;
|
||
|
||
import android.annotation.SuppressLint;
|
||
import android.content.BroadcastReceiver;
|
||
import android.content.Context;
|
||
import android.content.Intent;
|
||
import android.content.IntentFilter;
|
||
import android.content.res.Resources;
|
||
import android.graphics.drawable.Drawable;
|
||
import android.net.Uri;
|
||
import android.os.Build;
|
||
import android.os.Bundle;
|
||
import android.os.Handler;
|
||
import android.provider.Settings;
|
||
import android.view.MotionEvent;
|
||
import android.view.View;
|
||
import android.view.inputmethod.InputMethodManager;
|
||
import android.widget.EditText;
|
||
|
||
import androidx.annotation.Nullable;
|
||
import androidx.appcompat.app.AlertDialog;
|
||
import androidx.appcompat.app.AppCompatActivity;
|
||
import androidx.databinding.DataBindingUtil;
|
||
import androidx.databinding.ViewDataBinding;
|
||
|
||
import com.alibaba.android.arouter.launcher.ARouter;
|
||
import com.blankj.utilcode.util.ActivityUtils;
|
||
import com.blankj.utilcode.util.BarUtils;
|
||
import com.blankj.utilcode.util.LogUtils;
|
||
import com.hjq.toast.ToastUtils;
|
||
import com.xscm.moduleutil.R;
|
||
import com.xscm.moduleutil.dialog.LoadingDialog;
|
||
import com.xscm.moduleutil.utils.BackgroundManager;
|
||
import com.xscm.moduleutil.utils.ColorManager;
|
||
import com.xscm.moduleutil.utils.DisplayUtil;
|
||
import com.xscm.moduleutil.widget.QXGiftDriftView;
|
||
|
||
import org.greenrobot.eventbus.EventBus;
|
||
import org.greenrobot.eventbus.Subscribe;
|
||
import org.greenrobot.eventbus.ThreadMode;
|
||
|
||
import java.lang.reflect.Method;
|
||
|
||
public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends AppCompatActivity
|
||
implements BackgroundManager.BackgroundUpdateListener, ColorManager.ColorChangeListener {
|
||
|
||
@Override
|
||
protected void attachBaseContext(Context newBase) {
|
||
// 设置字体缩放比例为1.0f,即不跟随系统字体大小变化
|
||
super.attachBaseContext(DisplayUtil.attachBaseContext(newBase, 1.0f));
|
||
}
|
||
|
||
protected VDB mBinding;
|
||
|
||
@Subscribe (threadMode = ThreadMode.MAIN)
|
||
public void onEvent(Object event) {
|
||
}
|
||
|
||
private LoadingDialog mLoadingDialog;
|
||
// 添加广播接收器成员变量
|
||
private BroadcastReceiver mLogoutReceiver = new BroadcastReceiver() {
|
||
@Override
|
||
public void onReceive(Context context, Intent intent) {
|
||
if ("com.xscm.moduleutil.ACTION_USER_LOGOUT".equals(intent.getAction())) {
|
||
// 在这里处理用户登出后的UI更新
|
||
// 例如:隐藏需要登录才能显示的控件
|
||
// 或者跳转到登录状态的页面
|
||
handleUserLogout();
|
||
}
|
||
}
|
||
};
|
||
|
||
// 处理用户登出的方法
|
||
protected void handleUserLogout() {
|
||
// 子类可以重写此方法处理具体的登出逻辑
|
||
// 例如:更新UI状态、清除本地数据等
|
||
|
||
ActivityUtils.finishAllActivities();
|
||
}
|
||
|
||
QXGiftDriftView qxGiftDriftView;
|
||
protected void doDone(){}
|
||
@SuppressLint("UnspecifiedRegisterReceiverFlag")
|
||
@Override
|
||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
getWindow().getDecorView().setBackgroundResource(R.mipmap.log_bj);
|
||
setContentView(getLayoutId());
|
||
doDone();
|
||
// 隐藏标题栏
|
||
if (getSupportActionBar() != null) {
|
||
getSupportActionBar().hide();
|
||
}
|
||
mBinding = DataBindingUtil.setContentView(this, getLayoutId());
|
||
mBinding.setLifecycleOwner(this);
|
||
ARouter.getInstance().inject(this);
|
||
BarUtils.setStatusBarLightMode(this, isLightMode());
|
||
BarUtils.transparentStatusBar(this);
|
||
initView();
|
||
initData();
|
||
initCompleted();
|
||
|
||
// 注册背景更新监听器
|
||
BackgroundManager.getInstance().addListener(this);
|
||
// 尝试加载网络背景
|
||
loadNetworkBackground();
|
||
// 注册颜色变化监听器
|
||
ColorManager.getInstance().addColorChangeListener(this);
|
||
|
||
// 注册登出广播接收器
|
||
IntentFilter filter = new IntentFilter("com.xscm.moduleutil.ACTION_USER_LOGOUT");
|
||
registerReceiver(mLogoutReceiver, filter);
|
||
|
||
EventBus.getDefault().register(this);
|
||
}
|
||
|
||
// 在Activity中
|
||
private static final int REQUEST_OVERLAY_PERMISSION = 1001;
|
||
|
||
private void checkAndRequestOverlayPermission() {
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||
if (!Settings.canDrawOverlays(this)) {
|
||
new AlertDialog.Builder(this)
|
||
.setTitle("需要悬浮窗权限")
|
||
.setMessage("应用需要悬浮窗权限才能显示飘屏效果")
|
||
.setPositiveButton("去设置", (dialog, which) -> {
|
||
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||
Uri.parse("package:" + getPackageName()));
|
||
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
|
||
})
|
||
.setNegativeButton("取消", null)
|
||
.show();
|
||
}
|
||
}
|
||
}
|
||
|
||
@Override
|
||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||
super.onActivityResult(requestCode, resultCode, data);
|
||
if (requestCode == REQUEST_OVERLAY_PERMISSION) {
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||
if (Settings.canDrawOverlays(this)) {
|
||
ToastUtils.show("已获得悬浮窗权限");
|
||
} else {
|
||
ToastUtils.show("未获得悬浮窗权限");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onColorChanged() {
|
||
// 在主线程中更新UI
|
||
runOnUiThread(this::updateUIColors);
|
||
}
|
||
|
||
// 子类可以重写此方法来更新UI颜色
|
||
protected void updateUIColors() {
|
||
// 默认实现,子类可以覆盖
|
||
}
|
||
|
||
//在类中添加以下成员变量
|
||
private Handler timerHandler = new Handler();
|
||
private Runnable timerRunnable = new Runnable() {
|
||
@Override
|
||
public void run() {
|
||
// 调用你要执行的方法
|
||
// executePeriodicTask();
|
||
|
||
// 每10秒执行一次
|
||
timerHandler.postDelayed(this, 10000);
|
||
}
|
||
};
|
||
|
||
// 启动定时器的方法
|
||
private void startTimer() {
|
||
timerHandler.postDelayed(timerRunnable, 10000);
|
||
}
|
||
|
||
protected void loadNetworkBackground() {
|
||
// 只有当已经有背景URL时才加载
|
||
String backgroundUrl = BackgroundManager.getInstance().getBackgroundUrl();
|
||
if (backgroundUrl != null && !backgroundUrl.isEmpty()) {
|
||
// 检查是否有已加载的drawable
|
||
Drawable cachedDrawable = BackgroundManager.getInstance().getBackgroundDrawable();
|
||
if (cachedDrawable != null) {
|
||
getWindow().getDecorView().setBackground(cachedDrawable);
|
||
} else {
|
||
// 加载网络背景
|
||
BackgroundManager.getInstance().loadBackgroundDrawable(this, new BackgroundManager.BackgroundLoadCallback() {
|
||
@Override
|
||
public void onLoadSuccess(Drawable drawable) {
|
||
getWindow().getDecorView().setBackground(drawable);
|
||
}
|
||
|
||
@Override
|
||
public void onLoadFailed() {
|
||
// 加载失败时使用默认背景
|
||
getWindow().getDecorView().setBackgroundResource(R.mipmap.activity_bj);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onBackgroundUpdated(Drawable drawable) {
|
||
// 当背景更新时,更新当前Activity的背景
|
||
if (drawable != null) {
|
||
getWindow().getDecorView().setBackground(drawable);
|
||
}
|
||
}
|
||
|
||
// 提供一个方法供子类调用,用于设置背景URL
|
||
protected void setNetworkBackgroundUrl(String url) {
|
||
BackgroundManager.getInstance().setBackgroundUrl(url);
|
||
}
|
||
|
||
@Override
|
||
public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
|
||
Resources resources = super.getResources();
|
||
if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
|
||
android.content.res.Configuration configuration = resources.getConfiguration();
|
||
configuration.fontScale = 1.0f;
|
||
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
|
||
}
|
||
return resources;
|
||
}
|
||
|
||
static float fontScale = 1f;
|
||
|
||
// @Override
|
||
// public Resources getResources() {
|
||
// Resources resources = super.getResources();
|
||
// return DisplayUtil.getResources(this,resources,fontScale);
|
||
// }
|
||
|
||
public void setFontScale(float fontScale) {
|
||
this.fontScale = fontScale;
|
||
DisplayUtil.recreate(this);
|
||
}
|
||
|
||
public boolean isLightMode() {
|
||
return true;
|
||
}
|
||
|
||
protected abstract void initData();
|
||
|
||
protected abstract void initView();
|
||
|
||
protected void initCompleted() {
|
||
}
|
||
|
||
protected abstract int getLayoutId();
|
||
|
||
|
||
@Override
|
||
public void finish() {
|
||
EventBus.getDefault().unregister(this);
|
||
super.finish();
|
||
LogUtils.e(this.getComponentName()+"========finish");
|
||
}
|
||
|
||
@Override
|
||
protected void onDestroy() {
|
||
// 移除背景更新监听器
|
||
BackgroundManager.getInstance().removeListener(this);
|
||
// 移除颜色变化监听器
|
||
ColorManager.getInstance().removeColorChangeListener(this);
|
||
if (mBinding != null) {
|
||
mBinding.unbind();
|
||
}
|
||
try {
|
||
unregisterReceiver(mLogoutReceiver);
|
||
} catch (Exception e) {
|
||
// 忽略异常
|
||
}
|
||
|
||
try {
|
||
unregisterReceiver(mLogoutReceiver);
|
||
} catch (Exception e) {
|
||
// 忽略异常
|
||
}
|
||
super.onDestroy();
|
||
}
|
||
|
||
public void showLoading(String content) {
|
||
if (mLoadingDialog == null) {
|
||
mLoadingDialog = new LoadingDialog(this,content);
|
||
}
|
||
if (!mLoadingDialog.isShowing()) {
|
||
mLoadingDialog.show();
|
||
}
|
||
}
|
||
|
||
public void showLoading() {
|
||
if (mLoadingDialog == null) {
|
||
mLoadingDialog = new LoadingDialog(this);
|
||
}
|
||
if (!mLoadingDialog.isShowing()) {
|
||
mLoadingDialog.show();
|
||
}
|
||
}
|
||
|
||
public void disLoading() {
|
||
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
|
||
mLoadingDialog.dismiss();
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public boolean dispatchTouchEvent(MotionEvent ev) {
|
||
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
|
||
View view = getCurrentFocus();
|
||
if (isShouldHideInput(view, ev)) {
|
||
InputMethodManager Object = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||
if (Object != null) {
|
||
Object.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
||
}
|
||
}
|
||
}
|
||
try {
|
||
return super.dispatchTouchEvent(ev);
|
||
} catch (Exception e) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//判断是否隐藏键盘
|
||
public boolean isShouldHideInput(View v, MotionEvent event) {
|
||
if (v != null && (v instanceof EditText)) {
|
||
int[] leftTop = {0, 0};
|
||
//获取输入框当前的location位置
|
||
v.getLocationInWindow(leftTop);
|
||
int left = leftTop[0];
|
||
int top = leftTop[1];
|
||
int bottom = top + v.getHeight();
|
||
int right = left + v.getWidth();
|
||
if (event.getX() > left && event.getX() < right
|
||
&& event.getY() > top && event.getY() < bottom) {
|
||
// 点击的是输入框区域,保留点击EditText的事件
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
@Override
|
||
protected void onResume() {
|
||
super.onResume();
|
||
LogUtils.e(this.getComponentName()+"========onResume");
|
||
}
|
||
|
||
@Override
|
||
protected void onPause() {
|
||
super.onPause();
|
||
LogUtils.e(this.getComponentName()+"=========onPause");
|
||
}
|
||
|
||
|
||
@Override
|
||
protected void onStop() {
|
||
super.onStop();
|
||
LogUtils.e(this.getComponentName()+"=========onStop");
|
||
}
|
||
}
|