上一篇
安卓定时发送短信
- 行业动态
- 2025-04-22
- 3
核心实现思路
安卓定时发送短信主要依赖以下技术组合:
- AlarmManager:设置系统级定时任务
- SmsManager:调用系统短信接口
- BroadcastReceiver:接收定时触发事件
- 权限管理:处理运行时权限
关键实现步骤
权限配置
在 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" />
创建定时任务
// 设置精确的定时任务(API 19+) AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, SmsReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
短信发送逻辑
// 短信管理类 SmsManager smsManager = SmsManager.getDefault(); ArrayList<String> messageSegments = smsManager.divideMessage(content); for (String msg : messageSegments) { smsManager.sendTextMessage(phoneNumber, null, msg, null, null); }
数据存储方案对比
存储方式 | 优点 | 缺点 |
---|---|---|
SQLite | 支持复杂查询 | 需要手动管理数据库 |
SharedPreferences | 轻量级键值存储 | 不适合多条数据管理 |
Room持久化库 | 对象关系映射 | 学习成本较高 |
完整代码示例
// 定时广播接收器 public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 从SP获取短信数据 SharedPreferences sp = context.getSharedPreferences("sms_task", Context.MODE_PRIVATE); String number = sp.getString("target_number", ""); String content = sp.getString("sms_content", ""); // 执行发送 SmsManager.getDefault().sendTextMessage(number, null, content, null, null); // 发送完成后清除数据 sp.edit().clear().apply(); } }
常见问题解决方案
问题类型 | 解决方案 |
---|---|
应用被杀进程后失效 | 使用 JobScheduler 或 WorkManager 替代 AlarmManager |
省电模式导致延迟 | 改用 setWindow() 方法设置宽泛时间窗口 |
多条短信拼接异常 | 使用 SmsManager.divideMessage() 自动分割长短信 |
权限被撤销 | 在发送前检查权限状态,引导用户跳转设置页面重新授权 |
相关问题与解答
Q1:如何实现重复周期发送短信?
A1:可通过修改AlarmManager的设置类型:
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, System.currentTimeMillis() + firstInterval, interval, pendingIntent); // 设置首次执行时间和重复间隔
需注意在AndroidManifest.xml
添加WAKE_LOCK
权限防止CPU休眠影响周期任务。
Q2:如何确保应用重启后定时任务依然有效?
A2:需要在BroadcastReceiver
中监听系统启动广播,重新注册未完成的任务:
// 在Manifest中注册BOOT_COMPLETED接收器 <receiver android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> // 在接收器中恢复任务 public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { // 从本地数据库重新加载未发送的任务 // 重新注册AlarmManager } }