【问题标题】:Want to run accelerometer in background想在后台运行加速度计
【发布时间】:2014-03-10 20:31:40
【问题描述】:

我创建了一个应用程序,它记录加速度计值并将它们存储在一个文件中,并带有一个简单的开始停止按钮。即使屏幕关闭,我也希望它能够继续工作,直到按下停止按钮,这是最好的方法。有人告诉我 asyncTask,但不确定我是否应该完成整个课程。

公共类 StartAccelerometer 扩展 Activity 实现 SensorEventListener,OnClickListener {

private SensorManager SensorManager;
private Sensor Accelerometer;
TextView title,tvx,tvy,tvz;
EditText etshowval;
RelativeLayout layout;
private String acc;
private String read_str = "";
private final String filepath = "/mnt/sdcard/acc.txt";
private BufferedWriter BufferedWriter;
private BufferedReader BufferedReader;
private float x;
private float y;
private float z;

public static final int MSG_DONE = 1;
public static final int MSG_ERROR = 2;
public static final int MSG_STOP = 3;

private boolean running;
private Handler Handler;
private HandlerThread HandlerThread;


Button stop,start;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_accelerometer);
    SensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    Accelerometer = SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    SensorManager.registerListener(this, Accelerometer, android.hardware.SensorManager.SENSOR_DELAY_NORMAL);
  //get layout
    layout = (RelativeLayout) findViewById(R.id.relative);

    //get textviews
    title = (TextView)findViewById(R.id.name);   
    tvx = (TextView)findViewById(R.id.xval);
    tvy = (TextView)findViewById(R.id.yval);
    tvz = (TextView)findViewById(R.id.zval);
    etshowval = (EditText)findViewById(R.id.showval);
    title.setText("Accelerator");

    HandlerThread = new HandlerThread("Working Thread");
    HandlerThread.start();

    Handler = new Handler(HandlerThread.getLooper());
    Handler.post(Run);

    start= (Button) findViewById(R.id.startAccel);
    stop= (Button) findViewById(R.id.button2);
    start.setOnClickListener(this);
    stop.setOnClickListener(this);
}

private Runnable Run = new Runnable(){
    @Override
    public void run ()
    {
        while(true)
        {
            if (running)
            {

                try 
                {
                    WriteFile(filepath,acc);

                                      } 
                catch (Exception e) 
                {

                }

            }


            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
};

public void onClick(View view) 
{
    if(view.getId() == R.id.startAccel){
        start();

    }
    else if(view.getId() == R.id.button2){
        stop();
    }

}


private synchronized void start()
{
    running = true;
}

private synchronized void stop()
{
    running = false;
}



@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) 
{
}

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

    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
    {
        x = sensorEvent.values[0]; 
        y = sensorEvent.values[1]; 
        z = sensorEvent.values[2]; 
        acc= String.valueOf(x) + ", " + String.valueOf(y) + ", " + String.valueOf(z);

        tvx.setText("X = "+ String.valueOf(x));
        tvy.setText("Y = "+ String.valueOf(y));
        tvz.setText("Z = "+ String.valueOf(z));
    }
}

public void CreateFile(String path)
{
    File f = new File(path);
    try {
        Log.d("ACTIVITY", "Create a File.");
        f.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public String ReadFile (String filepath)
{
    BufferedReader = null;
    String tmp = null;

    if (!FileIsExist(filepath))
        CreateFile(filepath);

    try 
    {
        BufferedReader = new BufferedReader(new FileReader(filepath));
        // Read string
        while ((tmp = BufferedReader.readLine()) != null) 
        {
            tmp += "\n";
            read_str += tmp;
        }
    } 
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return read_str;
}

public void WriteFile(String filepath, String str)
{
    BufferedWriter = null;

    if (!FileIsExist(filepath))
        CreateFile(filepath);

    try 
    {
        BufferedWriter = new BufferedWriter(new FileWriter(filepath, true));
        BufferedWriter.write(str);
        BufferedWriter.newLine();
        BufferedWriter.flush();
        BufferedWriter.close();
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public boolean FileIsExist(String filepath)
{
    File f = new File(filepath);

    if (! f.exists())
    {
        Log.e("ACTIVITY", "File does not exist.");
        return false;
    }
    else
        return true;
}

@Override
protected void onPause()
{
// TODO Auto-generated method stub
   // mSensorManager.unregisterListener(this);
   // Toast.makeText(this, "Unregister accelerometerListener", Toast.LENGTH_LONG).show();
    //super.onPause();

    super.onPause();
    if (running == true) {
        SensorManager.unregisterListener(this);
} 

} }

【问题讨论】:

    标签: android-asynctask sensors android-sensors


    【解决方案1】:

    使用Service代替activity:

    On_start_service --> 注册监听器。

    On_stop_service --> 注销监听器。

    一旦您单击 start_button 启动服务并注册传感器,直到您单击 stop_button 加速度计传感器将继续侦听传感器值的变化。一次,如果您单击 stop_button 取消注册侦听器并获取最后更新的值并停止服务。

    您可以使用手动启动和停止服务

    startService()
    stopService()
    

    在 onStart() 函数中,您可以添加要执行的实际功能。

    服务会一直在后台运行,直到您的活动终止。

    有关服务的更多信息,请参阅http://developer.android.com/guide/components/services.html

    【讨论】:

    • 好的,感谢您的帮助,只是想尝试解决一些问题。当您说将活动更改为服务时,您是在谈论 xml 文件还是在主类的顶部。
    【解决方案2】:

    创建一个新服务,从点击start_button时的活动注册监听器并通过调用startService()启动服务 从单击 stop_button 时的活动中取消注册侦听器并使用 stopService() 停止服务。

    即使屏幕关闭,该服务也会继续监听传感器的变化,您可以记录加速度计的值。

    在 manifest 文件中声明服务,不要失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2014-01-10
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多