1

首先很抱歉重新发布这个问题,因为我之前没有发布我的代码只是写了一些行,现在我无法解释。所以再次用代码发布问题。我编写了一个代码,它将记录加速度计数据并将数据保存在 csv 文件中。我需要做的是我必须在后台运行加速器作为服务。所以,我已经完成了编写 1.running 加速度计的代码,2.在文本框中显示数据,3.将数据写入 csv 文件。剩下的就是让它成为一种服务。我给出了下面的代码(我做了多少)

        @SuppressWarnings("deprecation")
public class AccelerometerVaue extends Activity implements SensorListener {

    SensorManager sm = null;

    TextView xacc= null;
    TextView yacc = null;
    TextView zacc = null;
    TextView xorient = null;
    TextView yorient = null;
    TextView zorient = null;
    TextView text = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        setContentView(R.layout.activity_main);


        xacc = (TextView) findViewById(R.id.xvalue);
        yacc = (TextView) findViewById(R.id.yvalue);
        zacc = (TextView) findViewById(R.id.zvalue);
        xorient = (TextView) findViewById(R.id.xvalues);
        yorient = (TextView) findViewById(R.id.yvalues);
        zorient = (TextView) findViewById(R.id.zvalues);


    }



    @SuppressLint("SdCardPath")
    public void onSensorChanged(int sensor, float[] values) {
        synchronized (this) {

            if (sensor == SensorManager.SENSOR_ORIENTATION) {
                xorient.setText("Orientation X: " + values[0]);
                yorient.setText("Orientation Y: " + values[1]);
                zorient.setText("Orientation Z: " + values[2]);
            }
            if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
//              Time now = new Time();
//              now.setToNow();
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                String currentDateandTime = sdf.format(new Date());
                Log.d("Time",currentDateandTime);


                xacc.setText("Accel X: " + values[0]);
                yacc.setText("Accel Y: " + values[1]);
                zacc.setText("Accel Z: " + values[2]);
                String res=String.valueOf(currentDateandTime+"#"+values[0])+"#"+String.valueOf(values[1])+"#"+String.valueOf(values[2]);

                Log.d("test", res);


                CSVWriter writer = null;
                try 
                {
                    //Log.d("check","pasla");
                    //Environment.getExternalStorageDirectory().getPath();
                writer = new CSVWriter(new FileWriter("/sdcard/AccelData.csv",true), ',');
                String[] entries = res.split("#"); // array of your values

                writer.writeNext(entries); 
                //FileWriter
                writer.close();
                } 
                catch (IOException e)
                {
                //error
                }
            }            
        }
    }

    public void onAccuracyChanged(int sensor, int accuracy) {
        String tag = null;
        Log.e(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);

   }


    @Override
    protected void onResume() {
        super.onResume();
        sm.registerListener(this, 
                SensorManager.SENSOR_ORIENTATION |
                SensorManager.SENSOR_ACCELEROMETER,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onStop() {
        sm.unregisterListener(this);
        super.onStop();
    }    


}

所以,现在我需要运行一个后台服务,它将继续在后台获取加速度计数据,并继续保存到该 csv 文件中。我怎样才能做到这一点?我想再问一个是否可以在一段时间后获取acc数据?假设我在这里连续记录所有数据,这是巨大的,电池消耗将是巨大的。因此,我需要以这样一种方式实现该服务,使其在后台运行 15 分钟,并在每分钟开始时记录 10 秒的数据。

4

1 回答 1

0

我刚刚回答了一个类似的问题。

您可以使用 Android 的调度机制,称为AlarmManager来调度您的服务。

但是,这种方法存在一个问题:当系统处于省电睡眠状态时,您的服务必须获取唤醒锁才能正确执行,然后在完成后释放唤醒锁以使系统返回睡眠状态。实现这种唤醒锁获取/释放机制并非易事。

我建议使用 Commonsware 的WakefulIntentService以避免为您的服务编写自己的唤醒锁获取/释放机制。它非常易于使用。您将基本上声明一个扩展WakefulIntentService该类并覆盖其doWakefulWork()方法的类。在该方法中,您将轮询加速度计数据并将其写入文件。我只是让你在屏幕上显示数据的部分让你失望,我不知道该怎么做(我想你必须对服务执行绑定)。<:)

于 2013-06-18T18:17:02.200 回答