从同一应用程序中的另一个活动获取活动值

时间:2014-04-20 21:44:59

标签: android google-maps android-activity accelerometer sensor

我有一个Android应用程序,其中一个活动我正在使用Google Maps API V2,我有第二个活动,其上有一个Accelerometer。我通过使用相应的按钮在这两个活动之间切换。我正在尝试使用Accelerometer来检测用户驾驶时的制动情况,并在发生这种情况时在地图上放置标记。

如果我启动Accelerometer活动,然后切换到我的Map活动,我可以看到使用Log.d,Accelerometer不断从onSensorChanged获取其值,因此活动没有被关闭,这对我有好处。出于某种原因,虽然我似乎无法抓取Map活动上的值,因为它们的上升为0.0 0.0 0.0或null null null,具体取决于我使用的内容。有人可以告诉我如何做到这一点吗?

更新

Accelerometer代码的主要部分:

@Override
public void onSensorChanged(SensorEvent e) {
    // TODO Auto-generated method stub

    // alpha is calculated as t / (t + dT)
    // with t, the low-pass filter's time-constant
    // and dT, the event delivery rate      
    if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        // - + +        
        gravity[0] = alpha * gravity[0] + (1 - alpha) * e.values[0];
        gravity[1] = alpha * gravity[1] + (1 - alpha) * e.values[1];
        gravity[2] = alpha * gravity[2] + (1 - alpha) * e.values[2];

        acceleration[0] = e.values[0] - gravity[0];
        acceleration[1] = e.values[1] - gravity[1];
        acceleration[2] = e.values[2] - gravity[2];{

        txtX.setText(""+Math.round((acceleration[0] * 100.0) / 100.0));
        txtY.setText(""+Math.round((acceleration[1] * 100.0) / 100.0));
        txtZ.setText(""+Math.round((acceleration[2] * 100.0) / 100.0));
}

我想在Map活动的onLocationChanged侦听器中获取Accelerometer值,以便我可以在检测到减速时立即放置标记。

2 个答案:

答案 0 :(得分:0)

如果您看到日志消息告诉您仍在接收来自传感器的数据,则您可能仍在后台注册了该活动。这不是一个好主意,因为你可以快速耗尽电池(当你不再需要它时停止从传感器接收数据)。

要取消注册,请添加以下内容:

  @Override
  protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
  }

回到您的问题,您还需要注册Map活动,以便从传感器接收数据。 另一种解决方案可能是在服务中接收数据。

您可以在此处找到有关传感器的更多信息: http://developer.android.com/guide/topics/sensors/sensors_overview.html

答案 1 :(得分:0)

最后,我不得不创建另一类Accelerometer并将其转换为后台服务。后台服务工作得很好,我正在使用来自Accelerometer服务的广播和Map活动中的广播接收器来获取我的数据。

我将Intent和putExtras以及广播管理器放在Accelerometer服务的onSensorChanged中,如下所示:

@Override
public void onSensorChanged(SensorEvent e) {
    // TODO Auto-generated method stub

    if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        // - + +        
        gravity[0] = alpha * gravity[0] + (1 - alpha) * e.values[0];
        gravity[1] = alpha * gravity[1] + (1 - alpha) * e.values[1];
        gravity[2] = alpha * gravity[2] + (1 - alpha) * e.values[2];

        acceleration[0] = e.values[0] - gravity[0];
        acceleration[1] = e.values[1] - gravity[1];
        acceleration[2] = e.values[2] - gravity[2];

        //Log.d(TAG, ""+acceleration[0] + " "+acceleration[1] + " "+acceleration[2]);

        a = new Intent(ACCEL_UPDATE);
        a.putExtra(ACCEL_RESULT, acceleration[0]);
        a.putExtra(ACCEL_RESULT, acceleration[1]);
        a.putExtra(ACCEL_RESULT, acceleration[2]);
        manager = LocalBroadcastManager.getInstance(this);
        manager.sendBroadcast(a);
}

注意:ACCEL_RESULT和ACCEL_UPDATE只是广播接收者可以识别其来源的值和意图的字符串。 然后我在onCreate的地图活动中收到广播:

//Receiver of Accelerometer Service broadcasts
    broadcastReceiver2 = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent){
            x = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0);
            y = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0);
            z = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0);

            x = round(x,3,BigDecimal.ROUND_HALF_UP);
            y = round(y,3,BigDecimal.ROUND_HALF_UP);
            z = round(z,3,BigDecimal.ROUND_HALF_UP);

            //Log.d(TAG, "" + x + " " + y + " " + z);
        }
    };

使用Log.d我能够验证我确实正在接收onLocationChanged监听器中的值,因为我想:)。

@petlack你说的第一个答案是正确的,因为你说我应该使用服务,所以给你打勾。