【发布时间】:2019-06-19 19:23:11
【问题描述】:
我正在使用SmsManager 发送短信,并使用WorkManager 在后台发送短信。由于消息的数量是动态的,我为此链接了WorkerRequest。这是sn-p:
private fun startSmsWork(sms: Array<SmsEntity>) {
val gson = Gson()
val smsWorkerRequestBuilder = OneTimeWorkRequestBuilder<SmsWorker>()
smsWorkerRequestBuilder.setInputData(workDataOf(SMS_WORKER_INPUT_KEY to gson.toJson(sms[0])))
var continuation = WorkManager.getInstance()
.beginWith(smsWorkerRequestBuilder.build())
for (i in 1 until sms.size) {
smsWorkerRequestBuilder.setInputData(workDataOf(SMS_WORKER_INPUT_KEY to gson.toJson(sms[i])))
continuation = continuation.then(smsWorkerRequestBuilder.build())
}
continuation.enqueue()
}
这是我的工人阶级:
class SmsWorker(ctx: Context, workerParams: WorkerParameters) : Worker(ctx, workerParams) {
override fun doWork(): Result {
return try {
val data = inputData.getString(SMS_WORKER_INPUT_KEY)
val messages = Gson().fromJson(data, SmsEntity::class.java)
sendSms(messages)
Result.success()
} catch (e: Exception) {
Log.e("Sms", e.localizedMessage)
Result.failure()
}
}
private fun sendSms(msg: SmsEntity) {
try {
Log.d("SmsWorker", "Sending message ${msg.id}....")
val sentIntent = Intent(SENT_INTENT_ACTION)
sentIntent.putExtra(SENT_INTENT_EXTRA, msg.id)
val sentPI = PendingIntent.getBroadcast(applicationContext, 0, sentIntent, 0)
val deliveredIntent = Intent(DELIVERED_INTENT_ACTION)
deliveredIntent.putExtra(DELIVERED_INTENT_EXTRA, msg.id)
val deliveredPI = PendingIntent.getBroadcast(applicationContext, 0, sentIntent, 0)
val smsManager = SmsManager.getDefault()
smsManager.sendTextMessage(msg.num, null, msg.message, sentPI, deliveredPI)
} catch (e: Exception) {
Log.e("Sms", e.localizedMessage)
}
}
}
它工作正常,但我希望能够监控发送的每条消息。所以我为此添加了BroadcastReceiver,但BroadcastReceiver 接收的意图只是最新的(如果有多条消息)。我发现在发送消息之前我必须等待发送消息。
我的问题是如何在我的工作类中实现它,它应该在返回Result 对象之前等待BroadcastReceiver 中的结果。
非常感谢任何意见
【问题讨论】:
-
聚会有点晚了,但我遇到了同样的问题,广播接收器接收到上一条消息的数据多次。解决方案是将消息 id 分配给待处理意图的操作字段,这迫使操作系统分别处理不同的回调
标签: android broadcastreceiver android-workmanager