当前位置:首页 > 行业动态 > 正文

安卓定时发送短信

核心实现思路

安卓定时发送短信主要依赖以下技术组合:

  1. AlarmManager:设置系统级定时任务
  2. SmsManager:调用系统短信接口
  3. BroadcastReceiver:接收定时触发事件
  4. 权限管理:处理运行时权限

关键实现步骤

权限配置

AndroidManifest.xml 中声明必要权限:

安卓定时发送短信  第1张

<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
    }
}
0