权限配置与动态申请
AndroidManifest.xml配置
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
动态权限申请(Android 6.0+)
// 检查并请求权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SMS_CODE);
}
定时任务实现方案
组件 |
作用 |
AlarmManager |
设置精确的定时任务(如指定时间点触发) |
JobIntentService |
处理后台任务(兼容Android 8.0+) |
WorkManager |
处理周期性/延迟任务(推荐现代开发) |
BootReceiver |
监听设备重启后恢复未执行的任务 |
使用AlarmManager设置定时任务
// 设置单次定时任务(精确时间点)
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, SmsSendReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
广播接收器处理触发事件
public class SmsSendReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 启动服务发送短信
Intent serviceIntent = new Intent(context, SmsSendService.class);
// 添加任务参数(需通过Bundle/数据库传递)
context.startForegroundService(serviceIntent);
}
}
短信发送逻辑
public class SmsSendService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 获取任务参数(如接收人、内容)
String recipient = getRecipientFromDB(); // 从数据库读取
String message = getMessageFromDB();
// 发送短信
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(recipient, null, message, null, null);
// 更新任务状态为已发送
updateTaskStatus(recipient, "sent");
stopSelf();
return START_NOT_STICKY;
}
}
任务持久化存储
字段名 |
类型 |
说明 |
task_id |
INTEGER |
主键 |
phone_number |
TEXT |
接收人手机号 |
message |
TEXT |
trigger_time |
LONG |
触发时间戳(毫秒) |
status |
TEXT |
状态(pending/sent/failed) |
CREATE TABLE sms_tasks (
task_id INTEGER PRIMARY KEY AUTOINCREMENT,
phone_number TEXT NOT NULL,
message TEXT NOT NULL,
trigger_time INTEGER NOT NULL,
status TEXT DEFAULT 'pending'
);
常见问题与解决方案
问题 |
解决方案 |
应用被杀后任务不执行 |
使用 startForegroundService + 引导用户将应用加入电池优化白名单 |
定时任务不准确(省电模式) |
改用 setExactAndAllowWhileIdle 或 WorkManager |
权限被用户拒绝 |
提供备用方案(如提示用户手动开启权限) |
相关问题与解答
Q1: 如何实现每天定时发送短信?
A1:
修改AlarmManager的设置逻辑,使用AlarmManager.RTC_WAKEUP
类型并设置重复间隔:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 9); // 每天9点
calendar.set(Calendar.MINUTE, 30); // 30分
calendar.set(Calendar.SECOND, 0);
long triggerTime = calendar.getTimeInMillis();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, AlarmManager.INTERVAL_DAY, pendingIntent);
Q2: 如何确保任务在设备重启后仍然执行?
A2:

- 在
AndroidManifest.xml
中注册BootReceiver
: <receiver android:enabled="true" android:exported="false" android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
- 在
BootReceiver
中重新加载未完成的任务:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 查询数据库中status为"pending"的任务并重新设置Alarm
reloadPendingTasks(context);
}
}