一段时间代码,好像有点问题,先留着

本文详细介绍了如何通过计算确定每次任务更新的起始时间。利用Java和PHP两种语言实现了一个通用的方法来计算从一天的开始到当前时间所经过的秒数,并据此计算出本次更新的开始时间。

 private int frequency = 6; //更新频率
//--------------今天的开始时间start--------------
  Long todayStartUnix = null; 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  sdf.setTimeZone(TimeZone.getTimeZone("CST")); // 和服务器时区同步!!
  Calendar c = Calendar.getInstance();
  String todayStart = c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH)+1) + "-" + c.get(Calendar.DATE);
  try {
   todayStartUnix = sdf.parse(todayStart).getTime()/1000;  // 转为s
  } catch (ParseException e1) {   
   e1.printStackTrace();
  }  
  //--------------今天的开始时间end--------------
  
  long currentTime = System.currentTimeMillis()/1000; //当前时间  
  long durationTime = currentTime - todayStartUnix; //当前时间距今天开始的时间的差
  
  
  //--------------本次更新开始时间start---------------------
  @SuppressWarnings("unused")
  Long startTime = null;
  long updateIntervalTime = (long)86400/frequency; //每次更新时间间隔
  if(durationTime % updateIntervalTime == 0) { //如果在更新时间点
   startTime = currentTime - updateIntervalTime;
  } else { //不在更新点
   startTime = currentTime - updateIntervalTime - (durationTime % updateIntervalTime);
  }  
  //--------------本次更新开始时间end---------------------

 

 

 

 

 

 

 

private $frequency = 1;

 

//获取更新开始时间$startTime
  $totalTime = 24*60*60; //一天
  $frequency = $this->frequency; //更新频率
  $updateIntervalTime = $totalTime/$frequency; //每次更新时间间隔
  $currentTime = time(); //当前时间
  $dayStartTime = mktime(date('H'),date('i'),date('s'),date('m'),date('d'),date('Y')); //一天开始时间
  $durationTime = $dayStartTime = $currentTime; //当前距一天开始的时间差
  if($durationTime % $updateIntervalTime == 0) { //如果在更新时间点
   $startTime = $currentTime - $updateIntervalTime;
  } else { //不在更新点
   $startTime = $currentTime - $updateIntervalTime - ($durationTime % $updateIntervalTime);
  }  

 

非常关键的描述! 你说: > **“刚进入程序的时候他会显示时间等信息(状态栏内容),然后很快那些信息就消失了,下一个白色横条。但原主题好像是深蓝色条,时间能够一直显示。”** --- ## ✅ 问题定位:你遇到了典型的「状态栏闪烁 + 白条残问题 这个现象的本质是: > 📱 **状态栏从“可见”变为“被遮挡”,窗口背景为白色 → 白条暴露** 我们来一步步拆解。 --- ## 🔍 现象分析:为什么“一开始有状态栏,后来没了”? ### 正常情况: - 状态栏始终显示时间、电量、信号 - 背景是半透明或主题色(如深蓝/紫色) - 用户可以随时看到系统 UI ### 你的现状: | 阶段 | 表现 | |------|------| | 启动瞬间 | 状态栏正常显示(黑字/白字) | | 几百毫秒后 | 状态栏区域变成纯白横条,时间消失 | 👉 这说明:**你的 Activity 在启动后,“吃掉了”状态栏空间,并用白色背景填充了那块区域** --- ## 🧩 根本原因:`fitsSystemWindows=true` 没生效 或 被覆盖 虽然你在布局中设置了 `android:fitsSystemWindows="true"`,但以下任一情况会导致它失效: ### ❌ 常见罪魁祸首: | 原因 | 解释 | |------|------| | 1. `setDecorFitsSystemWindows(false)` 被调用 | 系统不再预状态栏空间 | | 2. 主题中设置了 `windowTranslucentStatus=true` | 强制透明状态栏,内容顶上去 | | 3. 根布局不是直接子 View | 中间嵌套了不支持 fitsSystemWindows 的容器 | | 4. 多层嵌套且未传递 `fitsSystemWindows` | 只有最外层设了,内层没设 | --- ## ✅ 关键诊断:你现在是不是用了 `WindowInsetsController` 或手动隐藏了状态栏? 检查你的 `MainActivity.java` 是否包含类似代码: ```java // ❌ 这类代码会隐藏状态栏 View decorView = getWindow().getDecorView(); int flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(flags); ``` 或者在 Android 10+ 使用了: ```java WindowInsetsController controller = getWindow().getInsetsController(); if (controller != null) { controller.hide(WindowInsets.Type.statusBars()); // ❌ 隐藏了状态栏 } ``` 👉 即使只调用一次,也会导致: - 状态栏视觉上“消失” - 实际空间被当前窗口占用 - 如果背景是白色 → 就出现“白横条” --- ## ✅ 解决方案:确保状态栏始终可见且有正确背景 ### ✅ 步骤 1:确认没有手动隐藏状态栏 删除任何关于 `setSystemUiVisibility()` 或 `insetsController.hide()` 的调用。 保持默认行为即可。 --- ### ✅ 步骤 2:在 `themes.xml` 中明确设置状态栏颜色 确保你使用的是非透明的状态栏颜色。 #### `res/values/themes.xml` ```xml <style name="Theme.Bus" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- 其他属性... --> <!-- ✅ 明确设置状态栏颜色为深色 --> <item name="android:statusBarColor">@color/status_bar_color</item> <!-- ✅ 确保窗口背景不是白色 --> <item name="android:windowBackground">@color/background</item> </style> ``` #### `res/values/colors.xml` ```xml <color name="status_bar_color">#FF0A2463</color> <!-- 深蓝色 --> <color name="background">#FF121212</color> <!-- 深灰/黑色主背景 --> ``` > ⚠️ 注意:`statusBarColor` 必须是不透明的颜色(以 `FF` 开头),否则会被视为“透明”。 --- ### ✅ 步骤 3:确保根布局启用 `fitsSystemWindows` ```xml <!-- activity_main.xml --> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- fragment 和 BottomNavigationView --> </androidx.constraintlayout.widget.ConstraintLayout> ``` 并且每个 Fragment 的根布局也要加: ```xml <!-- fragment_home.xml --> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:background="@color/background"> ``` > 💡 `fitsSystemWindows="true"` 的作用: > - 让系统自动给这个 View 加 `paddingTop` = 状态栏高度 > - 同时绘制一块和 `statusBarColor` 一样的“假状态栏”作为背景 --- ### ✅ 步骤 4:不要启用透明状态栏模式 确保 `themes.xml` 中 **没有** 这些: ```xml <!-- ❌ 删除这些 --> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:statusBarColor">@android:color/transparent</item> ``` 这些是用来做“沉浸式全屏”的,你现在不需要。 --- ## ✅ 最终效果对比 | 行为 | 修改前 | 修改后 | |------|--------|--------| | 状态栏是否可见 | 初始可见 → 很快消失 | 始终可见 | | 状态栏背景色 | 白色横条替代 | 深蓝色(或其他主题色) | | 时间/电量是否显示 | 否 | 是 ✅ | | 是否有白条 | 有 ❌ | 无 ✅ | | 内容起始位置 | 错乱 | 正确偏移 | --- ## 🛠️ 调试技巧:如何验证当前状态栏行为? ### 方法 1:打印 WindowInsets ```java ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container), (v, insets) -> { int statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top; Log.d("Insets", "Status Bar Height: " + statusBarHeight); return insets; }); ``` 如果返回 `0`,说明系统没给状态栏空间 → 被禁用了。 ### 方法 2:查看布局边界(Layout Bounds) 打开手机设置 → 开发者选项 → **显示布局边界** 你会看到: - 绿线:padding - 黄线:margin - 红线:视图边界 观察顶部是否有合理的 `paddingTop`。 --- ## ✅ 总结:修复“状态栏闪现后变白条”的完整步骤 | 步骤 | 操作 | |------|------| | 1 | 删除所有手动隐藏状态栏的代码(如 `setSystemUiVisibility`) | | 2 | 确保 `themes.xml` 中 `android:statusBarColor` 设置为非透明颜色 | | 3 | 设置 `android:windowBackground` 为深色,避免白色背景露出来 | | 4 | 所有根布局(Activity 和 Fragment)都添加 `android:fitsSystemWindows="true"` | | 5 | 删除 `windowTranslucentStatus` 等可能导致透明状态栏的属性 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值