每天必做的3件事

作者分享了近期的生活调整,包括晨跑锻炼提升体能、加强口语练习以应对职场需求,以及技术学习重点放在DB2数据库上。

1. 晨跑:  

       经过一段时间的锻炼,体能还是有所提高的。过去绕小区跑1圈多一点就需要歇息几次,现在基本上能坚持一口气跑完两圈了(不知道是否与穿上了adidas的performance系列有关系:-))。其实减轻体重只是其次,保持身体机能健康才是最重要的,尤其对于长期坐着办公的人们,特别如果再上个shift之类,就更加需要了。


2.口语练习:

      职业生涯的前6年因为工作环境原因从未用过口语,不过庆幸的是我一直维持着读写听的习惯,但是这仅仅是维持。目前的工作对我的口语已经提出了更高要求,必须将其列入每天必做事项。另外对于语音语调,好在我还没有养成坏习惯,例如受荷兰腔,印度腔的影响,还是以英式作为练习标准为佳。


3.技术知识的学习:

     严格地说,此项从未停止过,列在这里的原因是起码在近期,半年内会以DB2为主。理论的学习不应该花太长时间,多以动手+总结为主。



以上内容,必须做到!

基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在 Android 中实现“**每天 8 点以后执行一次任务**”,是一个非常常见的需求,比如: - 每日签到提醒 - 今日计划推送 - 数据自动同步 由于现代 Android 系统的省电机制(Doze、App Standby、厂商限制),不能使用简单的 `Handler` 或 `Timer`,而应采用系统级调度方案。 --- ## ✅ 最佳实践:使用 `AlarmManager` + `BroadcastReceiver` 实现精准触发 ### 🎯 目标: > **每天 8:00 整或稍后时间执行一次任务,即使应用被杀死也能运行** --- ### ✅ 方案一:使用 `AlarmManager`(推荐用于精确时间) #### 1. 创建 BroadcastReceiver 接收闹钟 ```java // DailyEightAMReceiver.java public class DailyEightAMReceiver extends BroadcastReceiver { private static final String TAG = "DailyEightAM"; @Override public void onReceive(Context context, Intent intent) { if ("com.example.EIGHT_AM_EVENT".equals(intent.getAction())) { Log.d(TAG, "⏰ 检测到 8:00,开始执行每日任务: " + new Date()); // 👇 执行你的业务逻辑 performDailyTask(context); } } private void performDailyTask(Context context) { // 示例:发送通知 sendNotification(context); // 其他操作:启动 WorkManager、更新数据库、签到等 } private void sendNotification(Context context) { NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( "eight_am_channel", "每日 8 点提醒", NotificationManager.IMPORTANCE_DEFAULT ); manager.createNotificationChannel(channel); } NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "eight_am_channel") .setSmallIcon(R.drawable.ic_alarm) .setContentTitle("早安!") .setContentText("今天的目标完成了吗?") .setAutoCancel(true) .setWhen(System.currentTimeMillis()); manager.notify(800, builder.build()); } } ``` #### 2. 创建调度器设置每天 8:00 触发 ```java // DailyTaskScheduler.java public class DailyTaskScheduler { private static final String ALARM_ACTION = "com.example.EIGHT_AM_EVENT"; private static final int REQUEST_CODE = 800; public static void schedule(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ALARM_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); // 设置每天 8:00 触发 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 如果当前时间已过 8:00,则设为明天 8:00 if (calendar.getTimeInMillis() <= System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_YEAR, 1); } long triggerAtMillis = calendar.getTimeInMillis(); if (alarmManager != null) { // 使用 setInexactRepeating 更省电(推荐) alarmManager.setInexactRepeating( AlarmManager.RTC_WAKEUP, triggerAtMillis, AlarmManager.INTERVAL_DAY, pendingIntent ); } } // 取消任务 public static void cancel(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ALARM_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, REQUEST_CODE, intent, PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE ); if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } } } ``` #### 3. 在 AndroidManifest.xml 中注册 Receiver ```xml <receiver android:name=".DailyEightAMReceiver" /> ``` > ⚠️ 注意:从 Android 8.0(API 26)开始,不能静态注册隐式广播(除了少数例外)。但我们可以使用 **显式 Intent + FLAG_IMMUTABLE** 来绕过限制。 ✅ 所以确保你使用的是 `PendingIntent.FLAG_IMMUTABLE`,这是 Android 12+ 的要求。 --- #### 4. 启动任务(建议在 Application 或首次启动时调用) ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); DailyTaskScheduler.schedule(this); // 设置每天 8:00 执行 } } ``` 并在 `AndroidManifest.xml` 声明: ```xml <application android:name=".MyApplication" ... > </application> ``` --- ### ✅ 方案二:使用 `WorkManager`(更现代,但不保证准时) 如果你不需要“正好 8:00”执行,而是“8:00 之后某时执行”,可以用 `WorkManager`。 ```java // 使用 PeriodicWorkRequest 每 24 小时运行一次 PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(EightAMWorker.class, 24, TimeUnit.HOURS) .setInitialDelay(calculateInitialDelayToEightAM(), TimeUnit.MILLISECONDS) .build(); WorkManager.getInstance(context).enqueueUniquePeriodicWork( "daily_8am_task", ExistingPeriodicWorkPolicy.REPLACE, workRequest ); ``` 其中 `calculateInitialDelayToEightAM()` 返回从现在到下一个 8:00 的毫秒数。 📌 优点:兼容 Doze 模式、自动恢复 📌 缺点:可能延迟到 9:00 甚至更晚才执行 --- ### ✅ 方案三:设备重启后恢复任务 如果用户重启手机,`AlarmManager` 的任务会丢失(除非你监听 `BOOT_COMPLETED`)。 #### 添加权限: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> ``` #### 创建 BootReceiver: ```java public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { // 重新设置闹钟 DailyTaskScheduler.schedule(context); } } } ``` #### 注册: ```xml <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ``` --- ## ✅ 补充:如何计算“到今天或明天 8:00”的延迟? ```java public static long calculateInitialDelayToEightAM() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); long eightAMToday = calendar.getTimeInMillis(); long now = System.currentTimeMillis(); if (now > eightAMToday) { calendar.add(Calendar.DAY_OF_YEAR, 1); // 明天 8:00 } return calendar.getTimeInMillis() - now; } ``` 可用于 `WorkManager` 的 `.setInitialDelay(...)` --- ## ✅ 总结对比 | 方案 | 是否准时 | 是否常驻 | 是否需 BOOT 广播 | 推荐场景 | |------|----------|-----------|------------------|-----------| | `AlarmManager` | ✅ 较准时(±几分钟) | ❌ 不常驻 | ✅ 需要 | 精确提醒、通知 | | `WorkManager` | ⚠️ 延迟容忍(可能晚几小时) | ✅ 自动恢复 | ❌ 不需要 | 后台同步、非实时任务 | | `Handler/Timer` | ❌ 应用退出即失效 | ✅ 常驻 | ❌ | ❌ 不推荐 | --- ## ✅ 推荐组合策略(生产环境) ```text ✅ 使用 AlarmManager 实现“每天 8:00 提醒” ✅ 结合 Notification 发送通知 ✅ 使用 BOOT_COMPLETED 广播恢复任务 ✅ 加上 WorkManager 处理后台逻辑(如数据上传) ``` 这样既能保证及时性,又能应对各种系统限制。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值