每天有一件让自己得意的事

  今天中午吃了一顿很有意义的饭,虽然我现在已经不记得吃了什么,但实际上我获益良多。
  
  跟我吃饭的朋友曾经非常贫困。在外地读大学,到广州打工,算个小白领,衣食无忧,但是总不能一辈子借住在亲戚家里。要买房子,要娶妻子,要生孩子,样样都要钱。他硬撑着买了一套小小的房子,首期将多年的积蓄一扫而光,每个月交房款的时候总是面无人色。
  他是做会计的,月初的时候忙着跑好几个地方帮人家做帐,每一处只赚几百块钱。
  就在那时我认识他。那时我们有时一起吃饭,他总是要请我,所以我每次都和他去街边吃大排档,或者云吞面。在付钱的时候,如果他拿出一张一百块的大钞,我总是说,哎,我有散钱。他有时争着给,有时不出声,并没有说谢谢。
  有一次,他打电话来,声音阴暗,说想借点钱。我让他到办公室楼下来拿钱,他很快就来了,告诉我,上个月跟他表弟借的钱付房款,但是这个月他表弟急着要用钱,所以……我没听他解释下去,一个大男人,开得了这个口,我不忍心再听下去。他拿了钱转身走了。我看他的背影,还是很挺拔,没有驼着背,这让我有一点小小的惊异。
  第二个月他就还了。我什么也没问。
  好朋友,就是这样了。
  
  好几年过去了。他的事业渐渐有点起色;房子供得七七八八了;妻子也娶了,尽管他说并不十分爱她;孩子一岁了,已经会叫爸爸。虽然没有大富大贵,但日子都走上正轨了,有时他请我吃饭,我也不坚持去大排档了。
  
  今天中午说起往事,我说:“那时真担心你,不知道你会不会就这样垮掉。”
  他笑了起来:“我有秘诀的。我不止一次觉得自己走投无路,觉得自己一无是处,没有一点能力,没有一点信心。但是靠着这我挨过来了。”
  他看到我专门听的样子,笑得更厉害了:“其实没什么的,我找了个本子,每天记日记。但是,我只记我自己得意的事情,每天一件。每天中午想一想自己今天做了什么让自己得意的事,如果没有,我就回忆,回忆以前我做过的让自己得意的事。你不会相信,我连小学三年级得过三好学生的奖励都回忆起来过。哈,我有一天实在没什么好写的,还记了一件事:我在街上走的时候有一个漂亮的女孩子朝我看了好几眼……不过,我没写上,那女孩子只有十二三岁。”
  我笑得止不住,他也在笑,但我分明看到,他眼里的泪。
  “但是现在好了,捱过去就好了。”他带着笑说。
  
  生活对每一个人来说都非易事,亲人、朋友、爱人,能帮你分担一些,能在关键时候拉你一把,但没有人能帮你承担一切,所以最要信任的是自己,对自己有信心,什么都捱得过去。在没有任何成就可以证明自己的时候,要自己去找,像他这样,每天给自己找一件得意的事,每天给自己一点信心,那么,一切都会好起来的。
在 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 处理后台逻辑(如数据上传) ``` 这样既能保证及时性,又能应对各种系统限制。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值