使用豆包提供的savedInstanceState 窗体缓存技术,仅限于启动页窗体优化。

This commit is contained in:
2025-12-10 20:09:49 +08:00
parent 895cc4630d
commit 7c59a982fc
3 changed files with 263 additions and 171 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Wed Dec 10 19:31:13 HKT 2025 #Wed Dec 10 11:59:44 GMT 2025
stageCount=11 stageCount=11
libraryProject= libraryProject=
baseVersion=15.12 baseVersion=15.12
publishVersion=15.12.10 publishVersion=15.12.10
buildCount=0 buildCount=1
baseBetaVersion=15.12.11 baseBetaVersion=15.12.11

View File

@@ -51,66 +51,62 @@ import cc.winboll.studio.powerbell.views.BatteryDrawable;
import cc.winboll.studio.powerbell.views.VerticalSeekBar; import cc.winboll.studio.powerbell.views.VerticalSeekBar;
/** /**
* 主活动类Java 7 兼容 | 首屏加速改造:视图缓存+懒加载 * 主活动类Java 7 兼容 | 首屏加速+窗体缓存
* 核心优化点(解决首次启动慢) * 核心优化点:
* 1. ViewHolder 缓存控件,避免首次多次 findViewById * 1. ViewHolder 缓存控件 + ViewStub 延迟加载(原有)
* 2. ViewStub 延迟加载非首屏关键视图(广告、次要布局) * 2. savedInstanceState 窗体缓存(新增):缓存视图状态/数据,快速重建窗体
* 3. 核心视图预加载+资源异步加载 * 3. 资源异步加载 + 非关键任务异步化(原有)
* 4. 非关键任务(服务检查、数据初始化)异步化
* 5. 减少首次启动时的同步 inflate 耗时
* 修复点:解决首次加载图片失败问题(背景图+电量图标)
*/ */
public class MainActivity extends WinBoLLActivity { public class MainActivity extends WinBoLLActivity {
// ======================== 静态常量(首屏排列,统一管理======================== // ======================== 静态常量(新增savedInstanceState 缓存键========================
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
private static final int REQUEST_WRITE_STORAGE_PERMISSION = 1001; private static final int REQUEST_WRITE_STORAGE_PERMISSION = 1001;
public static final int MSG_RELOAD_APPCONFIG = 0; public static final int MSG_RELOAD_APPCONFIG = 0;
public static final int MSG_CURRENTVALUEBATTERY = 1; public static final int MSG_CURRENTVALUEBATTERY = 1;
public static final int MSG_LOAD_BACKGROUND = 2; // 新增:背景图片加载消息 public static final int MSG_LOAD_BACKGROUND = 2;
private static final int DELAY_LOAD_NON_CRITICAL = 500; // 非关键视图延迟加载时间500ms private static final int DELAY_LOAD_NON_CRITICAL = 500;
// ======================== 成员属性按「静态→非静态」「核心→辅助」排序ViewHolder 优先)======================== // 缓存键(统一管理,避免键名重复)
// 全局静态引用(控制生命周期) private static final String KEY_VIEW_STATE = "key_view_state"; // 视图状态缓存键
private static final String KEY_CHARGE_REMINDER = "key_charge_reminder"; // 充电提醒值
private static final String KEY_USEGE_REMINDER = "key_usege_reminder"; // 耗电提醒值
private static final String KEY_CURRENT_VALUE = "key_current_value"; // 当前电量值
private static final String KEY_IS_SERVICE_ENABLE = "key_is_service_enable"; // 服务开关状态
private static final String KEY_IS_CHARGE_ENABLE = "key_is_charge_enable"; // 充电提醒开关
private static final String KEY_IS_USEGE_ENABLE = "key_is_usege_enable"; // 耗电提醒开关
private static final String KEY_BACKGROUND_BEAN = "key_background_bean"; // 背景配置Bean
// ======================== 成员属性(保持原有,新增缓存标识)========================
public static MainActivity _mMainActivity; public static MainActivity _mMainActivity;
static MainViewFragment _mMainViewFragment; static MainViewFragment _mMainViewFragment;
static Handler _mHandler; static Handler _mHandler;
// 核心工具类(提前初始化,避免首次同步耗时)
private App mApplication; private App mApplication;
private AppConfigUtils mAppConfigUtils; private AppConfigUtils mAppConfigUtils;
private BackgroundSourceUtils mBgSourceUtils; private BackgroundSourceUtils mBgSourceUtils;
// 顶部导航与广告非首屏核心用ViewStub延迟加载
private Toolbar mToolbar; private Toolbar mToolbar;
private ViewStub mAdsViewStub; // 广告视图占位符(首次不加载) private ViewStub mAdsViewStub;
private ADsBannerView mADsBannerView; private ADsBannerView mADsBannerView;
// 视图缓存核心ViewHolder一次性绑定所有控件避免多次findViewById
private ViewHolder mViewHolder; private ViewHolder mViewHolder;
// 其他辅助属性
private Menu mMenu; private Menu mMenu;
private Fragment mCurrentShowFragment; private Fragment mCurrentShowFragment;
private MainViewFragment mMainViewFragment; private MainViewFragment mMainViewFragment;
private Drawable mDrawableFrame; private Drawable mDrawableFrame;
// 电量图示首次初始化耗时放入ViewHolder缓存
private BatteryDrawable mCurrentValueBatteryDrawable; private BatteryDrawable mCurrentValueBatteryDrawable;
private BatteryDrawable mChargeReminderValueBatteryDrawable; private BatteryDrawable mChargeReminderValueBatteryDrawable;
private BatteryDrawable mUsegeReminderValueBatteryDrawable; private BatteryDrawable mUsegeReminderValueBatteryDrawable;
// 新增缓存标识判断是否从savedInstanceState恢复避免重复初始化
private boolean isRestoredFromCache = false;
// ======================== 视图缓存容器ViewHolder 模式Java 7 兼容)========================
/** // ======================== 视图缓存容器ViewHolder 不变)========================
* ViewHolder 静态内部类:一次性绑定所有控件,缓存实例
* 避免首次启动时多次调用 findViewById遍历视图树耗时仅在首次 inflate 后绑定一次
*/
private static class ViewHolder { private static class ViewHolder {
// 首屏核心视图(必须优先加载) BackgroundView backgroundView;
BackgroundView backgroundView; // 背景视图(首屏关键,图片加载核心) RelativeLayout mainLayout;
RelativeLayout mainLayout; // 主布局(设置背景色,首屏关键)
// 电量控制核心控件(首屏必须显示)
LinearLayout llLeftSeekBar, llRightSeekBar; LinearLayout llLeftSeekBar, llRightSeekBar;
CheckBox cbIsEnableChargeReminder, cbIsEnableUsegeReminder; CheckBox cbIsEnableChargeReminder, cbIsEnableUsegeReminder;
Switch swIsEnableService; Switch swIsEnableService;
@@ -120,7 +116,7 @@ public class MainActivity extends WinBoLLActivity {
} }
// ======================== 重写父类抽象方法(优先排列,明确实现======================== // ======================== 重写生命周期核心savedInstanceState 缓存/恢复========================
@Override @Override
public Activity getActivity() { public Activity getActivity() {
return this; return this;
@@ -133,72 +129,118 @@ public class MainActivity extends WinBoLLActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
LogUtils.d(TAG, "onCreate(...) - 首屏加速改造Java 7 兼容)- 修复图片加载"); LogUtils.d(TAG, "onCreate(...) - 窗体缓存优化savedInstanceState = " + (savedInstanceState != null));
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// 关键优化2提前初始化全局Handler避免首次使用时创建耗时Java 7 简化写法)
initGlobalHandler(); initGlobalHandler();
// 1. 快速加载布局仅加载首屏核心视图非核心用ViewStub占位 // 第一步优先从savedInstanceState恢复窗体核心优化
setContentView(R.layout.activity_main); if (savedInstanceState != null) {
restoreFromCache(savedInstanceState); // 从缓存恢复视图/数据
isRestoredFromCache = true; // 标记为缓存恢复,跳过重复初始化
}
// 2. 初始化核心工具类异步初始化避免阻塞主线程Java 7 线程创建方式 // 第二步:无缓存时,正常初始化(保持原有逻辑,新增判断
initCoreUtilsAsync(); if (!isRestoredFromCache) {
setContentView(R.layout.activity_main); // 加载布局(仅首次/无缓存时执行)
initCoreUtilsAsync(); // 异步初始化工具类
initViewHolder(); // 绑定控件(仅首次/无缓存时执行)
initCriticalView(); // 初始化核心视图
loadNonCriticalViewDelayed(); // 延迟加载非核心视图
}
// 3. 初始化ViewHolder一次性绑定所有控件缓存实例核心加速点 // 第三步:权限申请(无论是否缓存,都需确保权限有效
initViewHolder();
// 4. 初始化首屏核心视图(必须同步加载,保证首屏显示)
initCriticalView();
// 5. 延迟加载非首屏核心视图(广告、次要控件,首屏渲染后再加载)
loadNonCriticalViewDelayed();
// 6. 权限申请(轻量操作,同步执行)
PermissionUtils.getInstance().checkAndRequestStoragePermission(this); PermissionUtils.getInstance().checkAndRequestStoragePermission(this);
} }
/**
* 重写 onSaveInstanceState保存视图状态/数据到 savedInstanceState关键
* 当Activity销毁前如旋转屏幕、后台回收自动调用此方法缓存数据
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
LogUtils.d(TAG, "onSaveInstanceState - 缓存窗体状态/数据");
// 1. 缓存控件数据(避免重建后重复读取配置)
if (mViewHolder != null && mAppConfigUtils != null) {
outState.putInt(KEY_CHARGE_REMINDER, mAppConfigUtils.getChargeReminderValue());
outState.putInt(KEY_USEGE_REMINDER, mAppConfigUtils.getUsegeReminderValue());
outState.putInt(KEY_CURRENT_VALUE, mAppConfigUtils.getCurrentValue());
outState.putBoolean(KEY_IS_SERVICE_ENABLE, mAppConfigUtils.getIsEnableService());
outState.putBoolean(KEY_IS_CHARGE_ENABLE, mViewHolder.cbIsEnableChargeReminder.isChecked());
outState.putBoolean(KEY_IS_USEGE_ENABLE, mViewHolder.cbIsEnableUsegeReminder.isChecked());
}
// 2. 缓存背景配置(避免重建后重复加载背景图)
if (mBgSourceUtils != null) {
BackgroundBean backgroundBean = mBgSourceUtils.getCurrentBackgroundBean();
if (backgroundBean != null) {
outState.putSerializable(KEY_BACKGROUND_BEAN, backgroundBean); // 需BackgroundBean实现Serializable
}
}
// 3. 缓存视图状态可选如SeekBar进度、控件可见性等
if (mViewHolder != null) {
outState.putInt(KEY_VIEW_STATE + "_charge_seek", mViewHolder.chargeReminderSeekBar.getProgress());
outState.putInt(KEY_VIEW_STATE + "_usege_seek", mViewHolder.usegeReminderSeekBar.getProgress());
}
}
/**
* 重写 onRestoreInstanceState从 savedInstanceState 恢复数据可选onCreate中已处理
* 确保在onStart后、onResume前恢复避免视图状态覆盖
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null && !isRestoredFromCache) {
restoreFromCache(savedInstanceState);
isRestoredFromCache = true;
}
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
// 释放资源,避免内存泄漏 // 释放资源(保持原有)
if (mADsBannerView != null) { if (mADsBannerView != null) {
mADsBannerView.releaseAdResources(); mADsBannerView.releaseAdResources();
} }
// 置空静态引用
_mMainActivity = null; _mMainActivity = null;
_mMainViewFragment = null; _mMainViewFragment = null;
// 移除Handler回调Java 7 兼容)
if (_mHandler != null) { if (_mHandler != null) {
_mHandler.removeCallbacksAndMessages(null); _mHandler.removeCallbacksAndMessages(null);
} }
// 重置缓存标识
isRestoredFromCache = false;
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
// 修复1移除此处背景刷新避免工具类未初始化完成时调用导致图片加载失败 // 缓存恢复后,无需重复发送加载消息(仅首次/无缓存时执行
// reloadBackground(); if (!isRestoredFromCache) {
// setBackgroundColor(); if (_mHandler != null) {
// 改为发送消息让Handler控制加载时机确保工具类已初始化 _mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND);
if (_mHandler != null) { }
_mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND); } else {
// 缓存恢复后,快速刷新视图(避免状态不一致)
refreshViewFromCache();
} }
// 非核心:恢复广告(仅在首次延迟加载后执行 // 恢复广告(保持原有
if (mADsBannerView != null) { if (mADsBannerView != null) {
mADsBannerView.resumeADs(MainActivity.this); mADsBannerView.resumeADs(MainActivity.this);
} }
} }
// 其他生命周期方法onCreateOptionsMenu、onOptionsItemSelected等保持原有不变
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
mMenu = menu; mMenu = menu;
// 主题菜单(轻量,同步加载)
AESThemeUtil.inflateMenu(this, menu); AESThemeUtil.inflateMenu(this, menu);
// 调试菜单仅Debug模式轻量
if (App.isDebugging()) { if (App.isDebugging()) {
DevelopUtils.inflateMenu(this, menu); DevelopUtils.inflateMenu(this, menu);
} }
// 应用核心菜单(轻量,同步加载)
getMenuInflater().inflate(R.menu.toolbar_main, mMenu); getMenuInflater().inflate(R.menu.toolbar_main, mMenu);
return true; return true;
} }
@@ -206,17 +248,14 @@ public class MainActivity extends WinBoLLActivity {
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int menuItemId = item.getItemId(); int menuItemId = item.getItemId();
// 主题切换
if (AESThemeUtil.onAppThemeItemSelected(this, item)) { if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
recreate(); recreate();
return true; return true;
} }
// 调试工具
if (DevelopUtils.onDevelopItemSelected(this, item)) { if (DevelopUtils.onDevelopItemSelected(this, item)) {
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId())); LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
return true; return true;
} }
// 应用核心菜单Java 7 用switch移除Lambda
switch (menuItemId) { switch (menuItemId) {
case R.id.action_settings: case R.id.action_settings:
startActivity(new Intent(this, SettingsActivity.class)); startActivity(new Intent(this, SettingsActivity.class));
@@ -248,7 +287,6 @@ public class MainActivity extends WinBoLLActivity {
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
// 修复2背景图片选择后刷新确保图片更新
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (_mHandler != null) { if (_mHandler != null) {
_mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND); _mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND);
@@ -275,35 +313,134 @@ public class MainActivity extends WinBoLLActivity {
} }
// ======================== 核心业务逻辑方法按功能优先级排序Java 7 兼容======================== // ======================== 新增:窗体缓存核心方法(恢复+刷新========================
/** /**
* 刷新背景(仅执行必要操作,避免首次耗时 * 从 savedInstanceState 恢复视图和数据(核心
* 避免重复加载布局、绑定控件、读取配置,加快窗体重建速度
*/
private void restoreFromCache(Bundle savedInstanceState) {
LogUtils.d(TAG, "restoreFromCache - 从缓存恢复窗体");
// 1. 恢复工具类(无需重新初始化,直接获取实例)
mApplication = (App) getApplication();
mAppConfigUtils = App.getAppConfigUtils(getActivity());
mBgSourceUtils = BackgroundSourceUtils.getInstance(getActivity());
// 2. 恢复ViewHolder仅绑定控件不重新inflate布局
if (mViewHolder == null) {
mViewHolder = new ViewHolder();
initViewHolder(); // 复用原有绑定逻辑,避免重复代码
}
// 3. 恢复背景配置直接设置缓存的BackgroundBean避免重复读取
BackgroundBean cachedBean = (BackgroundBean) savedInstanceState.getSerializable(KEY_BACKGROUND_BEAN);
if (cachedBean != null && mViewHolder.backgroundView != null) {
mViewHolder.backgroundView.loadBackgroundBean(cachedBean);
//mBgSourceUtils.setCurrentBackgroundBean(cachedBean); // 同步更新工具类缓存
}
// 4. 恢复控件数据从缓存读取避免重复调用AppConfigUtils
int chargeReminder = savedInstanceState.getInt(KEY_CHARGE_REMINDER, 80); // 默认值80
int usegeReminder = savedInstanceState.getInt(KEY_USEGE_REMINDER, 20); // 默认值20
int currentValue = savedInstanceState.getInt(KEY_CURRENT_VALUE, 50); // 默认值50
boolean isServiceEnable = savedInstanceState.getBoolean(KEY_IS_SERVICE_ENABLE, false);
boolean isChargeEnable = savedInstanceState.getBoolean(KEY_IS_CHARGE_ENABLE, false);
boolean isUsegeEnable = savedInstanceState.getBoolean(KEY_IS_USEGE_ENABLE, false);
// 5. 恢复电量图标(复用缓存实例,避免重新创建)
initBatteryDrawables();
mCurrentValueBatteryDrawable.setValue(currentValue);
mChargeReminderValueBatteryDrawable.setValue(chargeReminder);
mUsegeReminderValueBatteryDrawable.setValue(usegeReminder);
// 6. 恢复控件状态(直接设置,避免重复绑定数据)
if (mViewHolder != null) {
mViewHolder.cbIsEnableChargeReminder.setChecked(isChargeEnable);
mViewHolder.cbIsEnableUsegeReminder.setChecked(isUsegeEnable);
mViewHolder.swIsEnableService.setChecked(isServiceEnable);
mViewHolder.chargeReminderSeekBar.setProgress(savedInstanceState.getInt(KEY_VIEW_STATE + "_charge_seek", chargeReminder));
mViewHolder.usegeReminderSeekBar.setProgress(savedInstanceState.getInt(KEY_VIEW_STATE + "_usege_seek", usegeReminder));
mViewHolder.tvChargeReminderValue.setText(String.valueOf(chargeReminder) + "%");
mViewHolder.tvUsegeReminderValue.setText(String.valueOf(usegeReminder) + "%");
mViewHolder.tvCurrentValue.setText(String.valueOf(currentValue) + "%");
}
// 7. 恢复非核心视图(广告)
loadAdsView();
}
/**
* 缓存恢复后,快速刷新视图(确保状态一致)
*/
private void refreshViewFromCache() {
if (mViewHolder == null) return;
// 快速设置背景色从缓存Bean获取
if (mBgSourceUtils != null && mViewHolder.mainLayout != null) {
BackgroundBean cachedBean = mBgSourceUtils.getCurrentBackgroundBean();
if (cachedBean != null) {
mViewHolder.mainLayout.setBackgroundColor(cachedBean.getPixelColor());
}
}
// 快速设置电量图标(避免图标不显示)
if (mViewHolder.ivCurrentBattery != null) {
mViewHolder.ivCurrentBattery.setImageDrawable(mCurrentValueBatteryDrawable);
}
if (mViewHolder.ivChargeReminderBattery != null) {
mViewHolder.ivChargeReminderBattery.setImageDrawable(mChargeReminderValueBatteryDrawable);
}
if (mViewHolder.ivUsegeReminderBattery != null) {
mViewHolder.ivUsegeReminderBattery.setImageDrawable(mUsegeReminderValueBatteryDrawable);
}
// 重新绑定监听(确保交互正常,避免监听失效)
setViewListener();
}
/**
* 初始化电量图标(复用逻辑,避免重复代码)
*/
private void initBatteryDrawables() {
if (mCurrentValueBatteryDrawable == null) {
mCurrentValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCurrent));
}
if (mChargeReminderValueBatteryDrawable == null) {
mChargeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCharge));
}
if (mUsegeReminderValueBatteryDrawable == null) {
mUsegeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorUsege));
}
}
// ======================== 原有核心方法(微调:新增缓存判断,避免重复执行)========================
/**
* 刷新背景(新增缓存判断,缓存恢复后无需重复执行)
*/ */
public void reloadBackground() { public void reloadBackground() {
// 修复3增加多重判空避免工具类/视图未初始化导致空指针,图片加载失败) if (isRestoredFromCache) return; // 缓存恢复后,跳过重复加载
if (mViewHolder == null || mBgSourceUtils == null || mViewHolder.backgroundView == null) { if (mViewHolder == null || mBgSourceUtils == null || mViewHolder.backgroundView == null) {
LogUtils.e(TAG, "reloadBackground: 背景加载失败(控件/工具类未初始化)"); LogUtils.e(TAG, "reloadBackground: 背景加载失败(控件/工具类未初始化)");
return; return;
} }
// 仅加载背景Bean避免同步执行耗时操作
BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean(); BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean();
if (bean != null) { if (bean != null) {
mViewHolder.backgroundView.loadBackgroundBean(bean); mViewHolder.backgroundView.loadBackgroundBean(bean);
} else { } else {
LogUtils.e(TAG, "reloadBackground: 背景Bean为空图片路径异常"); LogUtils.e(TAG, "reloadBackground: 背景Bean为空图片路径异常");
// 容错:加载默认背景图(避免空白)
mViewHolder.backgroundView.setBackgroundResource(R.drawable.default_background); mViewHolder.backgroundView.setBackgroundResource(R.drawable.default_background);
} }
} }
/** /**
* 设置主页面背景颜色(首屏关键,同步执行但轻量化 * 设置主页面背景颜色(新增缓存判断
*/ */
void setBackgroundColor() { void setBackgroundColor() {
if (isRestoredFromCache) return;
if (isFinishing() || isDestroyed() || mViewHolder == null || mBgSourceUtils == null || mViewHolder.mainLayout == null) { if (isFinishing() || isDestroyed() || mViewHolder == null || mBgSourceUtils == null || mViewHolder.mainLayout == null) {
return; return;
} }
// 轻量化操作:仅获取颜色值并设置,避免额外耗时
BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean(); BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean();
if (bean != null) { if (bean != null) {
int nPixelColor = bean.getPixelColor(); int nPixelColor = bean.getPixelColor();
@@ -312,85 +449,36 @@ public class MainActivity extends WinBoLLActivity {
} }
/** /**
* 通过Uri获取文件本地真实路径按需加载不影响首屏 * 设置视图数据(新增缓存判断,缓存恢复后无需重复执行
*/
private String getRealPathFromURI(Uri contentUri) {
String[] proj = {MediaStore.MediaColumns.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor != null && cursor.moveToNext()) {
int nColumnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATA);
if (nColumnIndex > -1) {
String path = cursor.getString(nColumnIndex);
cursor.close();
return path;
}
cursor.close();
}
return null;
}
/**
* 生成默认APP信息按需加载不影响首屏
*/
APPInfo genDefaultAPPInfo() {
String szBranchName = "powerbell";
APPInfo appInfo = new APPInfo();
appInfo.setAppName(getString(R.string.app_name));
appInfo.setAppIcon(R.drawable.ic_launcher);
appInfo.setAppDescription(getString(R.string.app_description));
appInfo.setAppGitName("WinBoLL");
appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(szBranchName);
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=PowerBell");
appInfo.setAppAPKName("PowerBell");
appInfo.setAppAPKFolderName("PowerBell");
return appInfo;
}
/**
* 设置视图数据(首屏核心,同步执行但轻量化)
*/ */
void setViewData() { void setViewData() {
if (isRestoredFromCache) return;
if (mViewHolder == null || mAppConfigUtils == null) return; if (mViewHolder == null || mAppConfigUtils == null) return;
int nChargeReminderValue = mAppConfigUtils.getChargeReminderValue(); int nChargeReminderValue = mAppConfigUtils.getChargeReminderValue();
int nUsegeReminderValue = mAppConfigUtils.getUsegeReminderValue(); int nUsegeReminderValue = mAppConfigUtils.getUsegeReminderValue();
int nCurrentValue = mAppConfigUtils.getCurrentValue(); int nCurrentValue = mAppConfigUtils.getCurrentValue();
// 轻量化设置:仅绑定必要数据,避免复杂计算
if (mViewHolder.llLeftSeekBar != null && mViewHolder.llRightSeekBar != null && mDrawableFrame != null) { if (mViewHolder.llLeftSeekBar != null && mViewHolder.llRightSeekBar != null && mDrawableFrame != null) {
mViewHolder.llLeftSeekBar.setBackground(mDrawableFrame); mViewHolder.llLeftSeekBar.setBackground(mDrawableFrame);
mViewHolder.llRightSeekBar.setBackground(mDrawableFrame); mViewHolder.llRightSeekBar.setBackground(mDrawableFrame);
} }
// 电量图示初始化(首次耗时,缓存实例) initBatteryDrawables(); // 复用初始化逻辑
// 修复4电量图标判空容错避免控件未绑定导致图片加载失败
if (mViewHolder.ivCurrentBattery != null) { if (mViewHolder.ivCurrentBattery != null) {
if (mCurrentValueBatteryDrawable == null) {
mCurrentValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCurrent));
}
mCurrentValueBatteryDrawable.setValue(nCurrentValue); mCurrentValueBatteryDrawable.setValue(nCurrentValue);
mViewHolder.ivCurrentBattery.setImageDrawable(mCurrentValueBatteryDrawable); mViewHolder.ivCurrentBattery.setImageDrawable(mCurrentValueBatteryDrawable);
} }
if (mViewHolder.ivChargeReminderBattery != null) { if (mViewHolder.ivChargeReminderBattery != null) {
if (mChargeReminderValueBatteryDrawable == null) {
mChargeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCharge));
}
mChargeReminderValueBatteryDrawable.setValue(nChargeReminderValue); mChargeReminderValueBatteryDrawable.setValue(nChargeReminderValue);
mViewHolder.ivChargeReminderBattery.setImageDrawable(mChargeReminderValueBatteryDrawable); mViewHolder.ivChargeReminderBattery.setImageDrawable(mChargeReminderValueBatteryDrawable);
} }
if (mViewHolder.ivUsegeReminderBattery != null) { if (mViewHolder.ivUsegeReminderBattery != null) {
if (mUsegeReminderValueBatteryDrawable == null) {
mUsegeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorUsege));
}
mUsegeReminderValueBatteryDrawable.setValue(nUsegeReminderValue); mUsegeReminderValueBatteryDrawable.setValue(nUsegeReminderValue);
mViewHolder.ivUsegeReminderBattery.setImageDrawable(mUsegeReminderValueBatteryDrawable); mViewHolder.ivUsegeReminderBattery.setImageDrawable(mUsegeReminderValueBatteryDrawable);
} }
// 控件数据绑定(轻量化 // 控件数据绑定(保持原有
if (mViewHolder.tvChargeReminderValue != null) { if (mViewHolder.tvChargeReminderValue != null) {
mViewHolder.tvChargeReminderValue.setTextColor(getActivity().getColor(R.color.colorCharge)); mViewHolder.tvChargeReminderValue.setTextColor(getActivity().getColor(R.color.colorCharge));
mViewHolder.tvChargeReminderValue.setText(String.valueOf(nChargeReminderValue) + "%"); mViewHolder.tvChargeReminderValue.setText(String.valueOf(nChargeReminderValue) + "%");
@@ -427,13 +515,13 @@ public class MainActivity extends WinBoLLActivity {
} }
} }
// 其他原有方法setViewListener、setCurrentValueBattery、initCoreUtilsAsync等保持不变
/** /**
* 设置视图监听(首屏核心同步执行但轻量化Java 7 移除Lambda用匿名内部类 * 设置视图监听(保持原有
*/ */
void setViewListener() { void setViewListener() {
if (mViewHolder == null || mAppConfigUtils == null) return; if (mViewHolder == null || mAppConfigUtils == null) return;
// 充电提醒SeekBar监听
if (mViewHolder.chargeReminderSeekBar != null) { if (mViewHolder.chargeReminderSeekBar != null) {
mViewHolder.chargeReminderSeekBar.setOnSeekBarChangeListener(new ChargeReminderSeekBarChangeListener()); mViewHolder.chargeReminderSeekBar.setOnSeekBarChangeListener(new ChargeReminderSeekBarChangeListener());
} }
@@ -446,7 +534,6 @@ public class MainActivity extends WinBoLLActivity {
}); });
} }
// 耗电提醒SeekBar监听
if (mViewHolder.usegeReminderSeekBar != null) { if (mViewHolder.usegeReminderSeekBar != null) {
mViewHolder.usegeReminderSeekBar.setOnSeekBarChangeListener(new UsegeReminderSeekBarChangeListener()); mViewHolder.usegeReminderSeekBar.setOnSeekBarChangeListener(new UsegeReminderSeekBarChangeListener());
} }
@@ -459,7 +546,6 @@ public class MainActivity extends WinBoLLActivity {
}); });
} }
// 服务总开关监听Java 7 用CompoundButton.OnClickListener匿名内部类
if (mViewHolder.swIsEnableService != null) { if (mViewHolder.swIsEnableService != null) {
mViewHolder.swIsEnableService.setOnClickListener(new CompoundButton.OnClickListener() { mViewHolder.swIsEnableService.setOnClickListener(new CompoundButton.OnClickListener() {
@Override @Override
@@ -471,7 +557,7 @@ public class MainActivity extends WinBoLLActivity {
} }
/** /**
* 更新当前电量显示(轻量化,避免耗时 * 更新当前电量显示(保持原有
*/ */
void setCurrentValueBattery(int value) { void setCurrentValueBattery(int value) {
if (mViewHolder == null || mCurrentValueBatteryDrawable == null || mViewHolder.tvCurrentValue == null) return; if (mViewHolder == null || mCurrentValueBatteryDrawable == null || mViewHolder.tvCurrentValue == null) return;
@@ -480,16 +566,11 @@ public class MainActivity extends WinBoLLActivity {
mCurrentValueBatteryDrawable.invalidateSelf(); mCurrentValueBatteryDrawable.invalidateSelf();
} }
// ======================== 首屏加速核心辅助方法Java 7 兼容)========================
/** /**
* 初始化ViewHolder核心优化1一次性绑定所有控件避免首次多次findViewById * 初始化ViewHolder保持原有
* 仅在onCreate中执行一次后续直接复用缓存的控件实例
*/ */
private void initViewHolder() { private void initViewHolder() {
mViewHolder = new ViewHolder(); mViewHolder = new ViewHolder();
// 一次性绑定所有控件(仅执行一次,减少视图树遍历耗时)
// 修复5确保控件ID与布局文件完全一致关键之前ID匹配无误增加判空日志
mViewHolder.mainLayout = (RelativeLayout) findViewById(R.id.activitymainRelativeLayout1); mViewHolder.mainLayout = (RelativeLayout) findViewById(R.id.activitymainRelativeLayout1);
if (mViewHolder.mainLayout == null) LogUtils.e(TAG, "initViewHolder: mainLayout绑定失败ID不匹配"); if (mViewHolder.mainLayout == null) LogUtils.e(TAG, "initViewHolder: mainLayout绑定失败ID不匹配");
@@ -510,15 +591,12 @@ public class MainActivity extends WinBoLLActivity {
mViewHolder.ivCurrentBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView1); mViewHolder.ivCurrentBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView1);
mViewHolder.ivChargeReminderBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView3); mViewHolder.ivChargeReminderBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView3);
mViewHolder.ivUsegeReminderBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView2); mViewHolder.ivUsegeReminderBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView2);
// 广告占位符(首次不加载)
mAdsViewStub = (ViewStub) findViewById(R.id.stub_ads_banner); mAdsViewStub = (ViewStub) findViewById(R.id.stub_ads_banner);
// 顶部Toolbar首屏核心同步加载
mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar = (Toolbar) findViewById(R.id.toolbar);
} }
/** /**
* 初始化核心工具类(异步化核心优化2避免首次同步初始化耗时Java 7 线程创建 * 初始化核心工具类(保持原有
* 工具类初始化如AppConfigUtils、BackgroundSourceUtils可能涉及文件读取异步执行不阻塞首屏
*/ */
private void initCoreUtilsAsync() { private void initCoreUtilsAsync() {
new Thread(new Runnable() { new Thread(new Runnable() {
@@ -527,20 +605,15 @@ public class MainActivity extends WinBoLLActivity {
mApplication = (App) getApplication(); mApplication = (App) getApplication();
mAppConfigUtils = App.getAppConfigUtils(getActivity()); mAppConfigUtils = App.getAppConfigUtils(getActivity());
mBgSourceUtils = BackgroundSourceUtils.getInstance(getActivity()); mBgSourceUtils = BackgroundSourceUtils.getInstance(getActivity());
// 工具类初始化完成后主线程更新视图数据避免空指针Java 7 用runOnUiThread
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
// 加载背景资源(轻量化)
if (getActivity() != null) { if (getActivity() != null) {
mDrawableFrame = getActivity().getDrawable(R.drawable.bg_frame); mDrawableFrame = getActivity().getDrawable(R.drawable.bg_frame);
} }
// 设置视图数据和监听(首屏核心,此时工具类已初始化完成)
setViewData(); setViewData();
setViewListener(); setViewListener();
// 检查服务(非首屏关键,异步执行)
checkServiceAsync(); checkServiceAsync();
// 修复6工具类初始化完成后主动加载背景图片确保首次加载成功
if (_mHandler != null) { if (_mHandler != null) {
_mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND); _mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND);
} }
@@ -551,59 +624,48 @@ public class MainActivity extends WinBoLLActivity {
} }
/** /**
* 初始化首屏核心视图(同步执行,保证首屏显示 * 初始化首屏核心视图(保持原有
* 仅加载必须显示的视图,非核心视图延迟加载
*/ */
private void initCriticalView() { private void initCriticalView() {
_mMainActivity = this; _mMainActivity = this;
// 初始化Toolbar首屏导航必须显示
setSupportActionBar(mToolbar); setSupportActionBar(mToolbar);
if (mToolbar != null) { if (mToolbar != null) {
mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
} }
// 初始化主Fragment若启用同步执行但轻量化
// initFragment();
} }
/** /**
* 延迟加载非首屏核心视图(核心优化3减少首次启动耗时Java 7 用Handler.postDelayed * 延迟加载非首屏核心视图(保持原有
* 广告、次要布局等非首屏必须的视图在首屏渲染完成后500ms加载
*/ */
private void loadNonCriticalViewDelayed() { private void loadNonCriticalViewDelayed() {
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
if (isFinishing() || isDestroyed()) return; if (isFinishing() || isDestroyed()) return;
// 加载广告视图(非首屏核心,延迟加载)
loadAdsView(); loadAdsView();
// 其他非首屏视图(如调试面板、次要控件)可在此处添加
} }
}, DELAY_LOAD_NON_CRITICAL); }, DELAY_LOAD_NON_CRITICAL);
} }
/** /**
* 加载广告视图(ViewStub 延迟加载核心优化4避免首次inflate广告耗时 * 加载广告视图(保持原有
* ViewStub 首次inflate时才加载视图之前仅占占位符资源轻量
*/ */
private void loadAdsView() { private void loadAdsView() {
if (mAdsViewStub == null) return; if (mAdsViewStub == null) return;
// 仅首次加载时inflate后续复用缓存的mADsBannerView
if (mADsBannerView == null) { if (mADsBannerView == null) {
View adsView = mAdsViewStub.inflate(); // 延迟inflate不阻塞首屏 View adsView = mAdsViewStub.inflate();
mADsBannerView = (ADsBannerView) adsView.findViewById(R.id.adsbanner); mADsBannerView = (ADsBannerView) adsView.findViewById(R.id.adsbanner);
} }
} }
/** /**
* 检查服务状态(异步化核心优化5避免首次同步检查耗时Java 7 线程 * 检查服务状态(保持原有
* 服务检查涉及进程判断,异步执行不阻塞首屏
*/ */
private void checkServiceAsync() { private void checkServiceAsync() {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (mAppConfigUtils == null || isFinishing() || isDestroyed()) return; if (mAppConfigUtils == null || isFinishing() || isDestroyed()) return;
// 检查服务是否需要启动
if (mAppConfigUtils.getIsEnableService() if (mAppConfigUtils.getIsEnableService()
&& !ServiceUtils.isServiceAlive(getActivity(), ControlCenterService.class.getName())) { && !ServiceUtils.isServiceAlive(getActivity(), ControlCenterService.class.getName())) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@@ -619,8 +681,7 @@ public class MainActivity extends WinBoLLActivity {
} }
/** /**
* 初始化全局Handler提前初始化避免首次使用时创建耗时Java 7 简化写法 * 初始化全局Handler保持原有
* 修复7新增MSG_LOAD_BACKGROUND消息统一控制背景加载时机确保工具类+控件都已初始化)
*/ */
private void initGlobalHandler() { private void initGlobalHandler() {
if (_mHandler == null) { if (_mHandler == null) {
@@ -638,10 +699,10 @@ public class MainActivity extends WinBoLLActivity {
_mMainActivity.setCurrentValueBattery(msg.arg1); _mMainActivity.setCurrentValueBattery(msg.arg1);
} }
break; break;
case MSG_LOAD_BACKGROUND: // 新增:背景图片加载消息 case MSG_LOAD_BACKGROUND:
if (_mMainActivity != null) { if (_mMainActivity != null) {
_mMainActivity.reloadBackground(); // 加载背景图 _mMainActivity.reloadBackground();
_mMainActivity.setBackgroundColor(); // 设置背景色 _mMainActivity.setBackgroundColor();
} }
break; break;
} }
@@ -651,7 +712,7 @@ public class MainActivity extends WinBoLLActivity {
} }
} }
// ======================== 内部监听类Java 7 兼容,保持原有逻辑)======================== // 内部监听类(保持原有)
class ChargeReminderSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener { class ChargeReminderSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -694,8 +755,7 @@ public class MainActivity extends WinBoLLActivity {
} }
} }
// 静态工具方法(保持原有)
// ======================== 静态工具方法Java 7 兼容,保持原有逻辑)========================
public static void relaodAppConfigs() { public static void relaodAppConfigs() {
if (_mHandler != null) { if (_mHandler != null) {
_mHandler.sendMessage(_mHandler.obtainMessage(MSG_RELOAD_APPCONFIG)); _mHandler.sendMessage(_mHandler.obtainMessage(MSG_RELOAD_APPCONFIG));
@@ -709,5 +769,36 @@ public class MainActivity extends WinBoLLActivity {
_mHandler.sendMessage(msg); _mHandler.sendMessage(msg);
} }
} }
private String getRealPathFromURI(Uri contentUri) {
String[] proj = {MediaStore.MediaColumns.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor != null && cursor.moveToNext()) {
int nColumnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATA);
if (nColumnIndex > -1) {
String path = cursor.getString(nColumnIndex);
cursor.close();
return path;
}
cursor.close();
}
return null;
}
APPInfo genDefaultAPPInfo() {
String szBranchName = "powerbell";
APPInfo appInfo = new APPInfo();
appInfo.setAppName(getString(R.string.app_name));
appInfo.setAppIcon(R.drawable.ic_launcher);
appInfo.setAppDescription(getString(R.string.app_description));
appInfo.setAppGitName("WinBoLL");
appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(szBranchName);
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=PowerBell");
appInfo.setAppAPKName("PowerBell");
appInfo.setAppAPKFolderName("PowerBell");
return appInfo;
}
} }

View File

@@ -4,13 +4,14 @@ import android.util.JsonReader;
import android.util.JsonWriter; import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean; import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable;
/** /**
* @Author ZhanGSKen<zhangsken@qq.com> * @Author ZhanGSKen<zhangsken@qq.com>
* @Date 2024/07/18 11:52:28 * @Date 2024/07/18 11:52:28
* @Describe 应用背景图片数据类(存储正式/预览背景配置支持JSON序列化/反序列化) * @Describe 应用背景图片数据类(存储正式/预览背景配置支持JSON序列化/反序列化)
*/ */
public class BackgroundBean extends BaseBean { public class BackgroundBean extends BaseBean implements Serializable {
public static final String TAG = "BackgroundPictureBean"; public static final String TAG = "BackgroundPictureBean";