上一篇
安卓开发定时发送短信
- 行业动态
- 2025-04-21
- 7
权限配置与动态申请
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); } }