From 2cfc29845eea4942160c6e793694eac9acadb765 Mon Sep 17 00:00:00 2001 From: LaizyBoy Date: Sun, 3 May 2026 15:22:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(MainActivity):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E6=9D=83=E9=99=90=E6=A0=A1=E9=AA=8C=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=B8=8E=E7=A9=BA=E8=BD=AC=E7=8A=B6=E6=80=81UI?= =?UTF-8?q?=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 服务开关开启前增加定位权限前置校验,无权限时阻止开启并提示 2. 空转关闭时自动检测权限,无权限则强制停止GPS服务 3. 权限被拒绝时强制关闭服务开关并禁用管理按钮 4. 新增Toolbar副标题显示空转运行状态提示 5. 新增管理按钮状态刷新,空转中强制可点击并追加提示文字 6. 移除冗余注释,精简接口定义 --- positions/build.properties | 4 +- .../studio/positions/MainActivity.java | 99 ++++++++++--------- 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/positions/build.properties b/positions/build.properties index 402086a..8c6e5f0 100644 --- a/positions/build.properties +++ b/positions/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 03 05:39:16 GMT 2026 +#Sun May 03 15:20:10 CST 2026 stageCount=20 libraryProject= baseVersion=15.12 publishVersion=15.12.19 -buildCount=7 +buildCount=11 baseBetaVersion=15.12.20 diff --git a/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java b/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java index 3abe19c..f278144 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java +++ b/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java @@ -46,7 +46,7 @@ import cc.winboll.studio.positions.R; * 4. 全局权限申请与权限结果回调处理 * @Author 豆包&ZhanGSKen * @CreateTime 2026/05/03 12:23:00 - * @EditTime 2026/05/03 15:26:13 + * @EditTime 2026/05/03 15:42:15 */ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { @@ -71,16 +71,7 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { * 应用空转状态回调内部接口 */ public interface OnAppIdleRunningListener { - /** - * 接收空转开关状态变更 - * @param isRunning 空转是否开启 - */ void onIdleStatusChange(boolean isRunning); - - /** - * 接收空转日志消息 - * @param log 日志文本 - */ void onIdleLogReceive(String log); } @@ -112,7 +103,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { mADsBannerView = findViewById(R.id.adsbanner); initAppIdleHandler(); - // 初始化自动根据空转状态刷新日志面板 refreshIdleLogLayout(); } @@ -136,9 +126,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { } // ===================== 初始化相关方法 ===================== - /** - * 初始化顶部导航栏 - */ private void initToolbar() { mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); @@ -148,9 +135,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { LogUtils.d(TAG, "initToolbar -> 顶部工具栏初始化完毕"); } - /** - * 初始化全部UI控件与绑定事件 - */ private void initViews() { mTvIdleLog = (TextView) findViewById(R.id.tv_idle_log); mScrollIdleLog = (ScrollView) findViewById(R.id.scroll_idle_log); @@ -164,31 +148,31 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { mServiceSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + //切换开关时先校验权限,无权限直接强制关闭开关 + if(isChecked && !checkLocationPermissions()){ + mServiceSwitch.setChecked(false); + Toast.makeText(MainActivity.this,"未获取定位权限,无法开启GPS服务",Toast.LENGTH_SHORT).show(); + return; + } + LogUtils.d(TAG, "onCheckedChanged -> 服务开关状态变更,isChecked = " + isChecked); - if (isChecked && !checkLocationPermissions()) { - requestLocationPermissions(); - return; - } if (isChecked) { ServiceUtil.startAutoService(MainActivity.this); } else { ServiceUtil.stopAutoService(MainActivity.this); } mManagePositionsButton.setEnabled(isChecked); + refreshManageButtonState(); } }); LogUtils.i(TAG, "initViews -> 全部UI控件初始化绑定完成"); } - /** - * 初始化空转处理器并绑定监听回调 - */ private void initAppIdleHandler() { AppIdleRunningModeHandler.init(MainActivity.this); setOnAppIdleRunningListener(new OnAppIdleRunningListener() { @Override public void onIdleStatusChange(boolean isRunning) { - // 状态变更立刻刷新边框与日志 refreshIdleLogLayout(); appendIdleLog("IdleRunning Status : " + isRunning); } @@ -201,9 +185,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { LogUtils.i(TAG, "initAppIdleHandler -> 空转处理器初始化与监听绑定完成"); } - /** - * 设置主布局主题背景色 - */ private void setLLMainBackgroundColor() { TypedArray typedArray = getTheme().obtainStyledAttributes(new int[]{android.R.attr.colorAccent}); int colorAccent = typedArray.getColor(0, Color.GRAY); @@ -213,10 +194,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { } // ===================== 空转日志输出工具 ===================== - /** - * 追加空转日志并自动滚动至底部 - * @param logText 需要追加的日志文本 - */ private void appendIdleLog(final String logText) { runOnUiThread(new Runnable() { @Override @@ -233,11 +210,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { }); } - /** - * 日志面板样式自动控制 - * 非空转 = 清空日志 + 去除边框 - * 空转开启 = 恢复边框 - */ private void refreshIdleLogLayout() { runOnUiThread(new Runnable() { @Override @@ -245,19 +217,52 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { if (App.isAppIdleRunning()) { mScrollIdleLog.setBackgroundResource(R.drawable.shape_log_border); } else { + //关闭空转时:检测权限,无权限强制关闭GPS开关 + if(!checkLocationPermissions()){ + mServiceSwitch.setChecked(false); + ServiceUtil.stopAutoService(MainActivity.this); + } mTvIdleLog.setText(""); mScrollIdleLog.setBackgroundColor(Color.TRANSPARENT); LogUtils.d(TAG, "refreshIdleLogLayout -> 非空转状态:日志清空、边框已移除"); } + refreshToolbarSubTitle(); + refreshManageButtonState(); + } + }); + } + + private void refreshToolbarSubTitle() { + if(getSupportActionBar() == null){ + return; + } + if(App.isAppIdleRunning()){ + getSupportActionBar().setSubtitle("当前处于空转运行状态"); + }else{ + getSupportActionBar().setSubtitle(""); + } + } + + /** + * 空转状态专属:按钮强制可点击 + 文字追加提示 + */ + private void refreshManageButtonState() { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (App.isAppIdleRunning()) { + mManagePositionsButton.setText("位置与任务管理【当前空转中】"); + mManagePositionsButton.setEnabled(true); + } else { + mManagePositionsButton.setText("位置与任务管理"); + boolean serviceEnable = AppConfigsUtil.getInstance(MainActivity.this).isEnableMainService(true); + mManagePositionsButton.setEnabled(serviceEnable); + } } }); } // ===================== 权限处理相关 ===================== - /** - * 检查前台+后台定位权限 - * @return 权限是否全部通过 - */ private boolean checkLocationPermissions() { int foregroundPerm = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION); boolean hasForegroundPerm = (foregroundPerm == PackageManager.PERMISSION_GRANTED); @@ -270,9 +275,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { return hasForegroundPerm && hasBackgroundPerm; } - /** - * 发起定位权限动态申请 - */ private void requestLocationPermissions() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { @@ -301,6 +303,10 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { requestLocationPermissions(); } else { Toast.makeText(this, "需要前台定位权限才能使用该功能", Toast.LENGTH_SHORT).show(); + //权限被拒绝,强制关闭开关 + mServiceSwitch.setChecked(false); + ServiceUtil.stopAutoService(MainActivity.this); + mManagePositionsButton.setEnabled(false); } } else if (requestCode == REQUEST_BACKGROUND_LOCATION_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { @@ -332,14 +338,12 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { } else if (DevelopUtils.onDevelopItemSelected(this, item)) { LogUtils.d(TAG, "onOptionsItemSelected -> 进入开发工具菜单"); } else if (menuItemId == R.id.item_idle_switch) { - // 菜单切换应用空转状态 boolean idleNow = App.isAppIdleRunning(); boolean idleNew = !idleNow; App.setAppIdleRunning(idleNew); AppIdleRunningModeHandler.sendIdleSwitch(idleNew); AppIdleRunningModeHandler.sendIdleLog("菜单手动切换空转状态:" + idleNew); LogUtils.d(TAG, "onOptionsItemSelected -> 空转状态已切换,当前:" + idleNew); - // 切换立刻刷新UI样式 refreshIdleLogLayout(); } else if (menuItemId == R.id.item_settings) { Intent intent = new Intent(); @@ -355,9 +359,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { return true; } - /** - * 跳转位置管理页面 - */ public void onPositions(View view) { LogUtils.d(TAG, "onPositions -> 跳转位置任务管理页面"); startActivity(new Intent(MainActivity.this, LocationActivity.class));