Android Workmanager:返回结果

时间:2019-06-19 19:23:11

标签: android broadcastreceiver android-workmanager

我正在使用SmsManager发送短信,并且利用WorkManager来在后台发送短信。由于消息的数量是动态的,因此我为此链接了WorkerRequest。这是代码段:

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收到的意图只是最新的(如果有多个消息)。我发现在发送消息之前,我必须等待消息发送。

我的问题是我如何才能在我的工作人员类中实现这一点,即它应该在返回BroadcastReceiver对象之前在Result中等待结果。

非常感谢任何输入

1 个答案:

答案 0 :(得分:0)

如果要在工作进程期间异步等待操作结果,请使用ListenableWorker。

另外,一些一般性建议:由于您正在处理SMS,因此我很确定您的工作将需要网络约束。而且,如果您的用例合理,您可能还希望查看独特的工作并追加。