【问题标题】:Measure the SMS send speed测量短信发送速度
【发布时间】:2016-08-04 07:36:48
【问题描述】:

我需要测量 Android 设备中 SMS 的发送速度。我正在考虑以下方法。请让我知道它是否正确,或者是否有更好的解决方案。

计算发送 10 条消息所花费的时间,并计算发送每条消息所花费的平均时间。但是这里的速度量在哪里?字符数会增加花费的时间吗?

这是我写的代码。

    SmsManager smsManager = SmsManager.getDefault();
    long startTime = System.currentTimeMillis();

    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);
    smsManager.sendTextMessage("1234567890",null,text,null,null);

    long endTime = System.currentTimeMillis();

    long result = endTime - startTime;

result 是 742 毫秒,但我怀疑这是正确的。也就是说每条短信只需要74毫秒。

【问题讨论】:

  • 只是为了好奇,74ms有什么问题?是不是太长了?
  • 当我尝试使用设备发送短信时,发送大约需要 1.5 秒。
  • 你假设调用是同步的,我非常怀疑。最可能的 74ms 只是用于将 SMS 在传出队列中排队,而不是实际与最近的基站建立无线电链路并发送消息。

标签: android


【解决方案1】:

sendTextMessage() 方法的第四个参数是PendingIntent,它会在发送消息时触发。我们可以将当前系统时间作为额外的附加到 IntentPendingIntent,当它触发时,检索该额外并与当前系统时间进行比较。这将使我们能够准确衡量实际发送消息所需的时间。

我们将使用BroadcastReceiver 来处理PendingIntent,只需在其onReceive() 中检索额外发送的时间,并从那里计算从当前时间经过的时间。

BroadcastReceiver smsSendReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        long sentTime = intent.getLongExtra("sent_time", 0);
        long elapsedTime = System.currentTimeMillis() - sentTime;
        Toast.makeText(context, elapsedTime + "ms", Toast.LENGTH_SHORT).show();
    }
};

我们需要在发送消息之前注册这个Receiver。在ActivityService

registerReceiver(smsSendReceiver, new IntentFilter("SMS_SENT"));

在发送消息时,我们会将PendingIntent 结构“塞入”sendTextMessage() 调用中,因此我们不会无意中在获取当前时间和实际调用之间引入任何不必要的延迟。

SmsManager sm = SmsManager.getDefault();
sm.sendTextMessage("1234567890",
                   null,
                   "Testing...",
                   PendingIntent.getBroadcast(this,
                                              0,
                                              new Intent("SMS_SENT")
                                                  .putExtra("sent_time",
                                                            System.currentTimeMillis()),
                                              0),
                   null);

如果需要,可以多次运行,并根据结果计算平均值。如果这样做,请务必正确处理PendingIntents,以确保为每个广播提供正确的发送时间。在给定的示例中,一个简单的方法是为每个调用使用不同的请求代码 - getBroadcast() 中的第二个参数。

建议您在使用完 Receiver 后取消注册,以免您在日志中收到关于 Receiver 泄露的令人讨厌的消息。

unregisterReceiver(smsSendReceiver);

【讨论】:

    【解决方案2】:

    收到 SMS SENT msg 后设置广播接收器和更新时间。然后计算每条短信发送时间。链接可能会有所帮助Android SMS Delivery Intent always return -1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多