无法在BroadcastReceiver中读取currentTimeMillis

时间:2011-07-26 10:18:07

标签: android broadcastreceiver

我正在尝试衡量每个蓝牙发现过程发生的时间。我将currentTimeMillis分配给startTime和stopTime。当我将BroadcastReceiver类作为内部类时,我可以读取这两个变量,但是当我将它作为外部类时,我无法读取startTime。这是我的代码,

private long startTime;
private long stopTime;

@Override
public void onReceive(Context context, Intent intent) {
    String strIntent = intent.getAction();
    if (strIntent.equalsIgnoreCase(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
        handleDiscStarted();
    } else if (strIntent.equalsIgnoreCase(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
        handleDiscFinished();
    }
}

private void handleDiscStarted() {
    startTime = System.currentTimeMillis();
    Log.d(tag, "\nDiscovery started " + startTime);
}

private void handleDiscFinished() {
    stopTime = System.currentTimeMillis();
    Log.d(tag, "\nDiscovery finished " + stopTime + ", takes " + (stopTime-startTime) + " ms");
    // startTime = 0 here...
    Log.d(tag, "\nstopTime=" + stopTime + ", startTime=" + startTime);
}

知道不同行为发生的原因吗?如何在第二种情况下读取startTime?谢谢!

2 个答案:

答案 0 :(得分:2)

取自Receiver Lifecycle

  

BroadcastReceiver对象仅在通话期间有效   to onReceive(Context,Intent)。

因此,在计算结束时间时,您最初录制的开始时间将不存在。

如果你想适当地跟踪这个开始时间,我建议在持久存储中跟踪它,在这种情况下是SharedPreferences

答案 1 :(得分:0)

试试这样。从onClick()开始计算,将intent数据中的初始时间发送到BroadcastReciever,当您完成发现时,只需减去最后一次进入BroadcastReciever的时间}。这只是避免失去开始时间的另一种方式。如果您从同一个按钮调用启动和停止发现,请确保逻辑正常,并do not send the initial time twice