如何让传感器定期工作?

时间:2012-11-10 13:17:32

标签: android

我目前正在Android中开发一款应用程序,它会将传感器数据记录一段固定的时间,持续几个周期。例如,我计划将数据记录10秒钟,然后停止,让手机休息10秒钟,然后重新开始记录,......按此模式工作1小时。我的问题是,如何让手机自动执行此计划?我目前正在使用下面的代码(来自Android: How to collect sensor values for a fixed period of time?),但它仅适用于一个周期,我必须在确定上一个周期结束后手动启动新周期。

public void onResume() {
mSensorManager.registerListener(mListener, mSensorAcceleration, SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(mListener, mSensorMagnetic, SensorManager.SENSOR_DELAY_GAME);
Handler h = new Handler();
h.postDelayed(new Runnable() {

    @Override
    public void run() {
    //    do stuff with sensor values
        mSensorManager.unregisterListener(mListener);               
    }
}, 10000);

...

任何帮助将不胜感激!!

2 个答案:

答案 0 :(得分:2)

我认为有更好,更正确的方法来实现这一点。具体来说,我认为让Activity实施Runnable是错误的。它在其公共接口中泄漏逻辑,应该保持私有(和隐藏)。即没有人应该在活动之外调用run()。我建议如下实现它:

public class PostDelayedDemo extends Activity {
  // Declaration of sensor-related fields.

  private static final int PERIOD = 10000;
  private Handler handler;
  private final Runnable processSensors =
      new Runnable() {
         @Override
         public void run() {
           mSensorManager.registerListener(mListener, mSensorAcceleration, SensorManager.SENSOR_DELAY_GAME);
           mSensorManager.registerListener(mListener, mSensorMagnetic, SensorManager.SENSOR_DELAY_GAME);

           // Do work with the sensor values.

           mSensorManager.unregisterListener(mListener);

           // The Runnable is posted to run again here:
           handler.postDelayed(this, PERIOD);
         }
      };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    handler = new Handler();
  }

  @Override
  public void onResume() {
    super.onResume();

    handler.post(processSensors);
  }

  @Override
  public void onPause() {
    handler.removeCallbacks(processSensors);

    super.onPause();
  }
}

答案 1 :(得分:0)

步骤1:让您的活动实施Runnable,而不是使用匿名内部类,移动您在活动上实施的run()方法。

步骤2:在run()方法中,安排自己(活动)在使用postDelayed()延迟后再次运行。这个加上您对postDelayed()的现有号召,将有效地定期拨打run()

步骤3:跟踪您是处于“传感器开启”模式还是“传感器关闭”模式,并在run()中注册或取消注册听众。

步骤4:在onPause()中,拨打removeCallbacks()上的Handler,停止定期拨打run()

您将在this sample project中看到此类计划的示例 - 自己再次运行的逻辑。这是活动:

package com.commonsware.android.post;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class PostDelayedDemo extends Activity implements Runnable {
  private static final int PERIOD=5000;
  private View root=null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    root=findViewById(android.R.id.content);
  }

  @Override
  public void onResume() {
    super.onResume();

    run();
  }

  @Override
  public void onPause() {
    root.removeCallbacks(this);

    super.onPause();
  }

  @Override
  public void run() {
    Toast.makeText(PostDelayedDemo.this, "Who-hoo!", Toast.LENGTH_SHORT)
         .show();
    root.postDelayed(this, PERIOD);
  }
}