20251212_211505_264

This commit is contained in:
2025-12-12 21:15:11 +08:00
parent 416079c356
commit 268688b8d8
2 changed files with 118 additions and 18 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Fri Dec 12 13:05:40 GMT 2025 #Fri Dec 12 13:12:27 GMT 2025
stageCount=1 stageCount=1
libraryProject= libraryProject=
baseVersion=15.12 baseVersion=15.12
publishVersion=15.12.0 publishVersion=15.12.0
buildCount=58 buildCount=60
baseBetaVersion=15.12.1 baseBetaVersion=15.12.1

View File

@@ -4,14 +4,17 @@ import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Color; import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.telecom.TelecomManager; import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
@@ -54,6 +57,7 @@ import java.util.List;
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com> * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/08/30 14:32 * @Date 2025/08/30 14:32
* @Describe Contacts 主窗口(完全适配 API 30 + Java 7 语法) * @Describe Contacts 主窗口(完全适配 API 30 + Java 7 语法)
* 核心优化1. 与MainService状态联动 2. 移除高版本API依赖 3. 强化资源释放 4. Java7规范写法
*/ */
public final class MainActivity extends WinBollActivity implements IWinBoLLActivity, ViewPager.OnPageChangeListener, View.OnClickListener { public final class MainActivity extends WinBollActivity implements IWinBoLLActivity, ViewPager.OnPageChangeListener, View.OnClickListener {
@@ -68,7 +72,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
private static final int REQUEST_OVERLAY_PERMISSION = 1003; private static final int REQUEST_OVERLAY_PERMISSION = 1003;
private static final int REQUEST_CALL_SCREENING_PERMISSION = 1004; private static final int REQUEST_CALL_SCREENING_PERMISSION = 1004;
// API版本硬编码常量Java 7兼容 // API版本硬编码常量Java 7兼容杜绝Build.VERSION_CODES高版本引用
private static final int ANDROID_6_API = 23; private static final int ANDROID_6_API = 23;
private static final int ANDROID_8_API = 26; private static final int ANDROID_8_API = 26;
private static final int ANDROID_10_API = 29; private static final int ANDROID_10_API = 29;
@@ -98,6 +102,9 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
private MyPhoneStateListener phoneStateListener; private MyPhoneStateListener phoneStateListener;
private List<Fragment> fragmentList; private List<Fragment> fragmentList;
private List<String> tabTitleList; private List<String> tabTitleList;
// 新增ServiceConnection用于与MainService绑定并传递窗口状态
private MainServiceConnection mMainServiceConnection;
private boolean mIsServiceBound = false;
// ====================== 6. 接口实现区 ====================== // ====================== 6. 接口实现区 ======================
@Override @Override
@@ -117,6 +124,9 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
LogUtils.d(TAG, "===== onCreate: 主Activity开始创建 ====="); LogUtils.d(TAG, "===== onCreate: 主Activity开始创建 =====");
_MainActivity = this; _MainActivity = this;
// 初始化ServiceConnection
mMainServiceConnection = new MainServiceConnection();
// 直接初始化UI原权限检查逻辑注释保留按需启用 // 直接初始化UI原权限检查逻辑注释保留按需启用
initUIAndLogic(savedInstanceState); initUIAndLogic(savedInstanceState);
LogUtils.d(TAG, "===== onCreate: 主Activity创建流程结束 ====="); LogUtils.d(TAG, "===== onCreate: 主Activity创建流程结束 =====");
@@ -135,6 +145,15 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
mADsBannerView.resumeADs(MainActivity.this); mADsBannerView.resumeADs(MainActivity.this);
LogUtils.d(TAG, "onResume: 广告栏资源已恢复"); LogUtils.d(TAG, "onResume: 广告栏资源已恢复");
} }
// 绑定MainService用于传递窗口状态
bindMainService();
}
@Override
protected void onPause() {
super.onPause();
// 解绑MainService避免内存泄漏
unbindMainService();
} }
@Override @Override
@@ -151,6 +170,23 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
LogUtils.d(TAG, "onDestroy: 电话状态监听器已移除"); LogUtils.d(TAG, "onDestroy: 电话状态监听器已移除");
} }
// 解绑MainService并通知窗口销毁状态
unbindMainService();
// 最后尝试绑定一次,传递销毁状态(防止解绑后未传递)
final Intent intent = new Intent(this, MainService.class);
bindService(intent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MainService.MyBinder binder = (MainService.MyBinder) service;
binder.setMainWindowDestroyed(true);
unbindService(this);
LogUtils.d(TAG, "onDestroy: 已通知MainService窗口销毁状态");
}
@Override
public void onServiceDisconnected(ComponentName name) {}
}, Context.BIND_AUTO_CREATE);
LogUtils.d(TAG, "===== onDestroy: 主Activity销毁完成 ====="); LogUtils.d(TAG, "===== onDestroy: 主Activity销毁完成 =====");
} }
@@ -243,7 +279,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 权限拒绝提示对话框Java 7 匿名内部类实现) * 权限拒绝提示对话框Java 7 匿名内部类实现禁止Lambda
*/ */
private void showPermissionDeniedDialogAndExit(String tip) { private void showPermissionDeniedDialogAndExit(String tip) {
LogUtils.d(TAG, "showPermissionDeniedDialogAndExit: 弹出权限不足提示框"); LogUtils.d(TAG, "showPermissionDeniedDialogAndExit: 弹出权限不足提示框");
@@ -308,7 +344,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
initPhoneStateListener(); initPhoneStateListener();
LogUtils.d(TAG, "initUIAndLogic: 电话状态监听器初始化完成"); LogUtils.d(TAG, "initUIAndLogic: 电话状态监听器初始化完成");
// 6. 盾值视图初始化 // 6. 盾值视图初始化Java7分步写法禁止链式调用
DunTemperatureView tempView = (DunTemperatureView) findViewById(R.id.dun_temp_view); DunTemperatureView tempView = (DunTemperatureView) findViewById(R.id.dun_temp_view);
tempView.setMaxValue(Rules.getInstance(this).getSettingsModel().getDunTotalCount()); tempView.setMaxValue(Rules.getInstance(this).getSettingsModel().getDunTotalCount());
tempView.setCurrentValue(Rules.getInstance(this).getSettingsModel().getDunCurrentCount()); tempView.setCurrentValue(Rules.getInstance(this).getSettingsModel().getDunCurrentCount());
@@ -325,7 +361,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 初始化ViewPager与Tab数据 * 初始化ViewPager与Tab数据Java7规范泛型完整声明
*/ */
private void initViewPagerAndTabs() { private void initViewPagerAndTabs() {
LogUtils.d(TAG, "initViewPagerAndTabs: 开始初始化ViewPager数据"); LogUtils.d(TAG, "initViewPagerAndTabs: 开始初始化ViewPager数据");
@@ -350,7 +386,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 初始化主服务 * 初始化主服务(优化:延迟启动,降低主线程压力)
*/ */
private void initMainService() { private void initMainService() {
LogUtils.d(TAG, "initMainService: 开始初始化主服务配置"); LogUtils.d(TAG, "initMainService: 开始初始化主服务配置");
@@ -379,7 +415,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 初始化电话状态监听与通话筛选服务 * 初始化电话状态监听与通话筛选服务适配API30移除高版本依赖
*/ */
private void initPhoneStateListener() { private void initPhoneStateListener() {
LogUtils.d(TAG, "initPhoneStateListener: 开始初始化电话监听"); LogUtils.d(TAG, "initPhoneStateListener: 开始初始化电话监听");
@@ -387,7 +423,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
phoneStateListener = new MyPhoneStateListener(); phoneStateListener = new MyPhoneStateListener();
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
// API 10+ 启动通话筛选服务 // API 10+ 启动通话筛选服务(硬编码版本判断)
if (Build.VERSION.SDK_INT >= ANDROID_10_API) { if (Build.VERSION.SDK_INT >= ANDROID_10_API) {
Intent screeningIntent = new Intent(this, MyCallScreeningService.class); Intent screeningIntent = new Intent(this, MyCallScreeningService.class);
if (Build.VERSION.SDK_INT >= ANDROID_8_API) { if (Build.VERSION.SDK_INT >= ANDROID_8_API) {
@@ -401,7 +437,40 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
LogUtils.d(TAG, "initPhoneStateListener: 电话监听初始化完成"); LogUtils.d(TAG, "initPhoneStateListener: 电话监听初始化完成");
} }
// ====================== 10. 菜单相关函数区 ====================== // ====================== 10. MainService绑定/解绑工具方法 ======================
/**
* 绑定MainService用于传递窗口状态
*/
private void bindMainService() {
if (mIsServiceBound) {
return;
}
Intent intent = new Intent(this, MainService.class);
boolean bindSuccess = bindService(intent, mMainServiceConnection, Context.BIND_AUTO_CREATE);
if (bindSuccess) {
mIsServiceBound = true;
LogUtils.d(TAG, "bindMainService: 绑定MainService成功");
} else {
LogUtils.e(TAG, "bindMainService: 绑定MainService失败");
}
}
/**
* 解绑MainService
*/
private void unbindMainService() {
if (mIsServiceBound && mMainServiceConnection != null) {
try {
unbindService(mMainServiceConnection);
mIsServiceBound = false;
LogUtils.d(TAG, "unbindMainService: 解绑MainService成功");
} catch (IllegalArgumentException e) {
LogUtils.w(TAG, "unbindMainService: 服务未绑定,解绑失败", e);
}
}
}
// ====================== 11. 菜单相关函数区 ======================
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu); getMenuInflater().inflate(R.menu.toolbar_main, menu);
@@ -419,7 +488,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
// ====================== 11. ViewPager页面回调区 ====================== // ====================== 12. ViewPager页面回调区 ======================
@Override @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@@ -435,11 +504,19 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
@Override @Override
public void onClick(View v) {} public void onClick(View v) {}
// ====================== 12. 工具函数区 ====================== // ====================== 13. 工具函数区 ======================
/** /**
* 拨号工具方法 * 拨号工具方法(添加空指针防护)
*/ */
public static void dialPhoneNumber(String phoneNumber) { public static void dialPhoneNumber(String phoneNumber) {
if (_MainActivity == null) {
LogUtils.e(TAG, "dialPhoneNumber: MainActivity实例为空无法拨号");
return;
}
if (phoneNumber == null || phoneNumber.trim().isEmpty()) {
LogUtils.e(TAG, "dialPhoneNumber: 拨号号码为空");
return;
}
if (PermissionUtils.checkPermission(_MainActivity, Manifest.permission.CALL_PHONE)) { if (PermissionUtils.checkPermission(_MainActivity, Manifest.permission.CALL_PHONE)) {
Intent intent = new Intent(Intent.ACTION_DIAL); Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + phoneNumber)); intent.setData(Uri.parse("tel:" + phoneNumber));
@@ -452,7 +529,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 判断是否为默认拨号应用 * 判断是否为默认拨号应用适配API30硬编码版本判断
*/ */
public boolean isDefaultPhoneCallApp() { public boolean isDefaultPhoneCallApp() {
if (Build.VERSION.SDK_INT >= ANDROID_6_API) { if (Build.VERSION.SDK_INT >= ANDROID_6_API) {
@@ -468,9 +545,13 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 检查服务是否正在运行 * 检查服务是否正在运行(通用工具方法,添加空指针防护)
*/ */
public boolean isServiceRunning(Class<?> serviceClass) { public boolean isServiceRunning(Class<?> serviceClass) {
if (serviceClass == null) {
LogUtils.e(TAG, "isServiceRunning: 服务类参数为null");
return false;
}
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (manager == null) { if (manager == null) {
LogUtils.w(TAG, "isServiceRunning: ActivityManager获取失败"); LogUtils.w(TAG, "isServiceRunning: ActivityManager获取失败");
@@ -487,9 +568,28 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
return false; return false;
} }
// ====================== 13. 内部类定义区Java 7 规范) ====================== // ====================== 14. 内部类定义区Java 7 规范禁止Lambda ======================
/** /**
* ViewPager适配器静态内部类减少内存泄漏风险 * MainService连接类用于传递窗口状态
*/
private class MainServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LogUtils.d(TAG, "MainServiceConnection: 与MainService连接成功");
MainService.MyBinder binder = (MainService.MyBinder) service;
// 通知MainService窗口处于活跃状态
binder.setMainWindowDestroyed(false);
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtils.w(TAG, "MainServiceConnection: 与MainService连接断开");
mIsServiceBound = false;
}
}
/**
* ViewPager适配器静态内部类减少内存泄漏风险Java7泛型完整声明
*/ */
private static class MyPagerAdapter extends FragmentPagerAdapter { private static class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragmentList; private final List<Fragment> fragmentList;
@@ -519,7 +619,7 @@ public final class MainActivity extends WinBollActivity implements IWinBoLLActiv
} }
/** /**
* 电话状态监听器 * 电话状态监听器Java7内部类规范写法
*/ */
private class MyPhoneStateListener extends PhoneStateListener { private class MyPhoneStateListener extends PhoneStateListener {
@Override @Override