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

安卓开发定时发送短信

权限配置与动态申请

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 + 引导用户将应用加入电池优化白名单
定时任务不准确(省电模式) 改用 setExactAndAllowWhileIdleWorkManager
权限被用户拒绝 提供备用方案(如提示用户手动开启权限)

相关问题与解答

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:

安卓开发定时发送短信

  1. 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>
  2. BootReceiver中重新加载未完成的任务:
    public class BootReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 查询数据库中status为"pending"的任务并重新设置Alarm
            reloadPendingTasks(context);
        }
    }