1:修改BUG
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
package com.xscm.moduleutil.base;
|
||||
|
||||
import static androidx.core.app.ActivityCompat.startActivityForResult;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.Application;
|
||||
import android.content.ComponentCallbacks2;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.Signature;
|
||||
import android.content.res.Configuration;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -19,6 +19,8 @@ import android.provider.Settings;
|
||||
import android.util.Base64;
|
||||
import android.webkit.WebView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.multidex.MultiDex;
|
||||
import androidx.multidex.MultiDexApplication;
|
||||
|
||||
@@ -27,16 +29,23 @@ import com.blankj.utilcode.util.AppUtils;
|
||||
import com.blankj.utilcode.util.FileUtils;
|
||||
import com.blankj.utilcode.util.LogUtils;
|
||||
import com.blankj.utilcode.util.ProcessUtils;
|
||||
import com.blankj.utilcode.util.ServiceUtils;
|
||||
import com.lahm.library.EasyProtectorLib;
|
||||
import com.lahm.library.EmulatorCheckCallback;
|
||||
import com.xscm.moduleutil.R;
|
||||
import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener;
|
||||
import com.tencent.imsdk.v2.V2TIMManager;
|
||||
import com.tencent.imsdk.v2.V2TIMMessage;
|
||||
import com.tencent.imsdk.v2.V2TIMMessageManager;
|
||||
import com.tencent.imsdk.v2.V2TIMMessageReceipt;
|
||||
import com.tencent.imsdk.v2.V2TIMValueCallback;
|
||||
import com.xscm.moduleutil.bean.UserBean;
|
||||
import com.xscm.moduleutil.bean.UserInfo;
|
||||
import com.xscm.moduleutil.event.AppLifecycleEvent;
|
||||
import com.xscm.moduleutil.event.UnreadCountEvent;
|
||||
import com.xscm.moduleutil.interfaces.AppLifecycleUtil;
|
||||
import com.xscm.moduleutil.listener.MessageListenerSingleton;
|
||||
import com.xscm.moduleutil.rtc.AgoraManager;
|
||||
import com.xscm.moduleutil.service.MqttConnect;
|
||||
import com.xscm.moduleutil.utils.ARouteConstants;
|
||||
import com.xscm.moduleutil.utils.SpUtil;
|
||||
import com.xscm.moduleutil.utils.UtilConfig;
|
||||
import com.xscm.moduleutil.utils.config.EnvironmentEnum;
|
||||
@@ -59,8 +68,7 @@ import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.MessageDigest;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -69,7 +77,7 @@ import lombok.Getter;
|
||||
* Created by cxf on 2017/8/3.
|
||||
*/
|
||||
|
||||
public class CommonAppContext extends MultiDexApplication {
|
||||
public class CommonAppContext extends MultiDexApplication implements Application.ActivityLifecycleCallbacks {
|
||||
|
||||
private static CommonAppContext sInstance;
|
||||
private static Handler sMainThreadHandler;
|
||||
@@ -87,8 +95,6 @@ public class CommonAppContext extends MultiDexApplication {
|
||||
public String playCover;
|
||||
public boolean showSelf;//盲盒是否能送自己
|
||||
public String playName;
|
||||
private final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
|
||||
private ScheduledExecutorService scheduledExecutorServiceRoom = null;
|
||||
private MqttConnect mqttConnect=null;
|
||||
|
||||
// 添加后台状态标记
|
||||
@@ -106,22 +112,230 @@ public class CommonAppContext extends MultiDexApplication {
|
||||
return wasInBackground;
|
||||
}
|
||||
|
||||
private int activityCount = 0;
|
||||
|
||||
private Long masageCount;
|
||||
private int announcement_read_count;
|
||||
|
||||
public int getAnnouncement_read_count() {
|
||||
return announcement_read_count;
|
||||
}
|
||||
|
||||
public void setAnnouncement_read_count(int announcement_read_count) {
|
||||
this.announcement_read_count = announcement_read_count;
|
||||
}
|
||||
|
||||
public Long getMasageCount() {
|
||||
return masageCount;
|
||||
}
|
||||
|
||||
public void setMasageCount(Long masageCount) {
|
||||
this.masageCount = masageCount;
|
||||
}
|
||||
|
||||
private AppStateListener appStateListener;
|
||||
private boolean isListeningUnreadCount = false;
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
sInstance = this;
|
||||
sMainThreadHandler = new Handler();
|
||||
EnvironmentPrefs prefs = new EnvironmentPrefs(this);
|
||||
// 添加内存优化配置
|
||||
optimizeMemorySettings();
|
||||
currentEnvironment = prefs.getSelectedEnvironment();
|
||||
initialization();
|
||||
registerActivityLifecycleCallbacks(this);
|
||||
appStateListener = AppStateManager.getInstance();
|
||||
startListeningUnreadMessageCount();
|
||||
}
|
||||
// 在适当的位置(如onCreate或onResume)添加实时监听
|
||||
protected void startListeningUnreadMessageCount() {
|
||||
if (!isListeningUnreadCount) {
|
||||
// 添加未读消息数变化监听器
|
||||
V2TIMMessageManager messageManager = V2TIMManager.getMessageManager();
|
||||
messageManager.addAdvancedMsgListener(new V2TIMAdvancedMsgListener() {
|
||||
@Override
|
||||
public void onRecvNewMessage(V2TIMMessage msg) {
|
||||
// 收到新消息时更新未读数
|
||||
updateUnreadMessageCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRecvC2CReadReceipt(List<V2TIMMessageReceipt> receiptList) {
|
||||
// 收到C2C消息已读回执时更新未读数
|
||||
updateUnreadMessageCount();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
isListeningUnreadCount = true;
|
||||
// 首次获取未读数
|
||||
updateUnreadMessageCount();
|
||||
}
|
||||
}
|
||||
|
||||
// 更新未读消息数的方法
|
||||
private void updateUnreadMessageCount() {
|
||||
V2TIMManager.getConversationManager().getTotalUnreadMessageCount(new V2TIMValueCallback<Long>() {
|
||||
@Override
|
||||
public void onSuccess(Long aLong) {
|
||||
CommonAppContext.getInstance().setMasageCount(aLong != null ? aLong : 0L);
|
||||
// 通知未读数变化
|
||||
notifyUnreadCountChanged(aLong != null ? aLong : 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String desc) {
|
||||
// 错误处理
|
||||
CommonAppContext.getInstance().setMasageCount(0L);
|
||||
notifyUnreadCountChanged(0L);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 通知未读数变化的方法(可以发送广播或EventBus事件)
|
||||
private void notifyUnreadCountChanged(long unreadCount) {
|
||||
// 使用EventBus通知
|
||||
EventBus.getDefault().post(new UnreadCountEvent(unreadCount,0));
|
||||
|
||||
|
||||
}
|
||||
/**
|
||||
* 优化内存设置
|
||||
*/
|
||||
private void optimizeMemorySettings() {
|
||||
try {
|
||||
// 请求降低内存负载
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
// 启用自动内存管理优化
|
||||
registerComponentCallbacks(new ComponentCallbacks2() {
|
||||
@Override
|
||||
public void onTrimMemory(int level) {
|
||||
handleMemoryTrim(level);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(@NonNull Configuration newConfig) {}
|
||||
|
||||
@Override
|
||||
public void onLowMemory() {
|
||||
// 内存极低时的处理
|
||||
releaseNonEssentialResources();
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("Memory optimization setup failed: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理内存削减事件
|
||||
* @param level 削减级别
|
||||
*/
|
||||
private void handleMemoryTrim(int level) {
|
||||
switch (level) {
|
||||
case TRIM_MEMORY_RUNNING_MODERATE:
|
||||
// 应用正在运行,内存开始紧张
|
||||
LogUtils.d("Memory trim: moderate");
|
||||
break;
|
||||
case TRIM_MEMORY_RUNNING_LOW:
|
||||
// 应用正在运行,内存更加紧张
|
||||
LogUtils.d("Memory trim: low");
|
||||
releaseNonEssentialResources();
|
||||
break;
|
||||
case TRIM_MEMORY_RUNNING_CRITICAL:
|
||||
// 应用仍在运行,但系统已开始杀死后台进程
|
||||
LogUtils.d("Memory trim: critical");
|
||||
releaseAllNonEssentialResources();
|
||||
break;
|
||||
case TRIM_MEMORY_UI_HIDDEN:
|
||||
// 应用UI已隐藏,可以释放UI相关资源
|
||||
LogUtils.d("Memory trim: UI hidden");
|
||||
releaseUIResources();
|
||||
break;
|
||||
case TRIM_MEMORY_BACKGROUND:
|
||||
// 应用处于LRU列表中较远位置
|
||||
LogUtils.d("Memory trim: background");
|
||||
break;
|
||||
case TRIM_MEMORY_MODERATE:
|
||||
// 应用处于LRU列表中间位置
|
||||
LogUtils.d("Memory trim: moderate background");
|
||||
releaseAllNonEssentialResources();
|
||||
break;
|
||||
case TRIM_MEMORY_COMPLETE:
|
||||
// 应用处于LRU列表中最远位置,即将被杀死
|
||||
LogUtils.d("Memory trim: complete");
|
||||
releaseAllResources();
|
||||
break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 释放非必要资源
|
||||
*/
|
||||
private void releaseNonEssentialResources() {
|
||||
try {
|
||||
// 清理图片缓存
|
||||
// Glide.get(this).clearMemory();
|
||||
|
||||
// 释放MQTT资源
|
||||
if (mqttConnect != null) {
|
||||
mqttConnect.close();
|
||||
}
|
||||
|
||||
// 通知各个组件释放资源
|
||||
// EventBus.getDefault().post(new MemoryTrimEvent());
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("Error releasing non-essential resources: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 释放所有非必要资源
|
||||
*/
|
||||
private void releaseAllNonEssentialResources() {
|
||||
try {
|
||||
releaseNonEssentialResources();
|
||||
|
||||
// 进行垃圾回收
|
||||
System.gc();
|
||||
System.runFinalization();
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("Error releasing all non-essential resources: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 释放UI相关资源
|
||||
*/
|
||||
private void releaseUIResources() {
|
||||
try {
|
||||
// 可以在这里通知UI组件释放资源
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("Error releasing UI resources: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 释放所有资源
|
||||
*/
|
||||
private void releaseAllResources() {
|
||||
try {
|
||||
releaseAllNonEssentialResources();
|
||||
releaseUIResources();
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("Error releasing all resources: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void setAppStateListener(AppStateListener listener) {
|
||||
this.appStateListener = listener;
|
||||
}
|
||||
public void initialization(){
|
||||
UtilConfig.init(this);
|
||||
registerActivityLifecycleCallbacks();
|
||||
// registerActivityLifecycleCallbacks();
|
||||
initWebView();
|
||||
if (ProcessUtils.isMainProcess()) {
|
||||
initARouter();
|
||||
@@ -156,7 +370,7 @@ public class CommonAppContext extends MultiDexApplication {
|
||||
}
|
||||
}
|
||||
|
||||
requestBatteryOptimizationExemption();
|
||||
// requestBatteryOptimizationExemption();
|
||||
}
|
||||
private void requestBatteryOptimizationExemption() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
@@ -414,6 +628,11 @@ public class CommonAppContext extends MultiDexApplication {
|
||||
return mUserBean;
|
||||
}
|
||||
|
||||
public UserInfo getUserInfo() {
|
||||
UserInfo userInfo = SpUtil.getUserInfo();
|
||||
return userInfo;
|
||||
}
|
||||
|
||||
public void setUserBean(UserBean bean) {
|
||||
mUserBean = bean;
|
||||
}
|
||||
@@ -480,4 +699,109 @@ public class CommonAppContext extends MultiDexApplication {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityStarted(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResumed(@NonNull Activity activity) {
|
||||
if (activityCount == 0) {
|
||||
// 应用从后台回到前台
|
||||
if (appStateListener != null) {
|
||||
appStateListener.onAppForeground();
|
||||
}
|
||||
// handleAppForeground(activity);
|
||||
// AppStateManager.setRoomActivityMinimized(false);
|
||||
}
|
||||
activityCount++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityPaused(@NonNull Activity activity) {
|
||||
activityCount--;
|
||||
if (activityCount == 0) {
|
||||
// 应用切换到后台
|
||||
if (appStateListener != null) {
|
||||
appStateListener.onAppBackground();
|
||||
}
|
||||
// handleAppBackground(activity);
|
||||
// AppStateManager.setRoomActivityMinimized( true);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleAppBackground(Activity activity) {
|
||||
String className = activity.getClass().getName();
|
||||
if (className.contains("RoomActivity") && appStateListener != null) {
|
||||
// RoomActivity进入后台时显示悬浮窗
|
||||
appStateListener.setFloatingWindowVisible(true);
|
||||
}
|
||||
}
|
||||
private void handleAppForeground(Activity activity) {
|
||||
// 获取当前Activity的类名,避免直接引用类
|
||||
String className = activity.getClass().getName();
|
||||
|
||||
if (className.contains("LaunchPageActivity")) {
|
||||
// 对于启动页,我们需要检查是否应该跳转到主页面
|
||||
if (appStateListener != null && appStateListener.isFloatingWindowVisible()) {
|
||||
// 有悬浮窗,直接回到首页
|
||||
ARouter.getInstance().build(ARouteConstants.ME).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP).navigation();
|
||||
} else if (appStateListener != null && appStateListener.shouldShowSplash()) {
|
||||
// 需要显示启动页,但已经在启动页了,不需要额外操作
|
||||
return;
|
||||
} else {
|
||||
// 默认情况下,跳转到主页面
|
||||
ARouter.getInstance().build(ARouteConstants.ME).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP).navigation();
|
||||
}
|
||||
return; // 启动页或引导页不需要特殊处理
|
||||
}
|
||||
|
||||
if (appStateListener != null && appStateListener.isFloatingWindowVisible()) {
|
||||
// 有悬浮窗,直接回到首页
|
||||
// if (!className.contains("MainActivity")) {
|
||||
ARouter.getInstance().build(ARouteConstants.ME).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP).navigation();
|
||||
// }
|
||||
} else if (appStateListener != null && appStateListener.shouldShowSplash()) {
|
||||
// 需要显示启动页
|
||||
try {
|
||||
Class<?> splashActivityClass = Class.forName("com.xscm.modulemain.activity.LaunchPageActivity");
|
||||
Intent intent = new Intent(activity, splashActivityClass);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
activity.startActivity(intent);
|
||||
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showFloatingWindow(Activity activity) {
|
||||
// 这里实现显示悬浮窗的逻辑
|
||||
AppStateManager.getInstance().setFloatingWindowVisible(true);
|
||||
// 实际显示悬浮窗的代码,已实现
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityStopped(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityDestroyed(@NonNull Activity activity) {
|
||||
// String className = activity.getClass().getName();
|
||||
// if (className.contains("RoomActivity") && appStateListener != null) {
|
||||
// appStateListener.onRoomActivityDestroyed();
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user