Java 使用服务在后台运行应用程序

Java 使用服务在后台运行应用程序,java,android,service,Java,Android,Service,我是android开发的初学者。我正在尝试开发一个计步器应用程序,即使在应用程序关闭时也会计算步数。我正在使用服务,但每当我按下“后退”按钮时,所有步骤都会计数重置。我该怎么办?提前谢谢 主课 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); steps=(TextV

我是android开发的初学者。我正在尝试开发一个计步器应用程序,即使在应用程序关闭时也会计算步数。我正在使用服务,但每当我按下“后退”按钮时,所有步骤都会计数重置。我该怎么办?提前谢谢

主课

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    steps=(TextView) findViewById(R.id.step_value);
    distance=(TextView) findViewById(R.id.distance_value);
    skbar=(SeekBar) findViewById(R.id.seekBar1);
    tsen=(TextView) findViewById(R.id.textView1);
    calories=(TextView) findViewById(R.id.calories_value);
    sdf=new SimpleDateFormat("HH:mm:ss");
    try {
        date= sdf.parse(reset_time);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    current=System.currentTimeMillis();
    skbar.setProgress(10);

    skbar.setOnSeekBarChangeListener(onSeekBarListener);
    threshold=10;
    tsen.setTag(String.valueOf(threshold));

    prevy=0;
    presenty=0;
    step=0;

    accelaration=0.00f;
    enableAccelerometer();  
    if(current==set)
    {
        steps.setText(0);
    }
}
public void enableAccelerometer(){        
    sensormanager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
    sensormanager.registerListener(sensorEventListener, sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),sensormanager.SENSOR_DELAY_NORMAL);
      }
private SensorEventListener sensorEventListener=new SensorEventListener() { 

@Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        float x=event.values[0];
        float y=event.values[1];
        float z=event.values[2];

        presenty=y;

        if(Math.abs(presenty-prevy)>threshold)
                {
                    step++;
                    steps.setText(String.valueOf(step));
                    x=step/3;
                    miles=x*(float)0.001;
                    distance.setText(String.valueOf(miles));


                }



                prevy=y;


    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }
};



private OnSeekBarChangeListener onSeekBarListener=new OnSeekBarChangeListener() {

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        threshold=skbar.getProgress();
        tsen.setText(String.valueOf(threshold));

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        // TODO Auto-generated method stub

    }
};


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
protected ServiceConnection mServerConn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }


};

public void start() {
    // mContext is defined upper in code, I think it is not necessary to explain what is it 
    Intent i=new Intent(this,Myservice.class);
    mContext.bindService(i, mServerConn, Context.BIND_AUTO_CREATE);
    mContext.startService(i);
}

public void stop() {
    mContext.stopService(new Intent(mContext, Myservice.class));
    mContext.unbindService(mServerConn);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch(item.getItemId())
    {

    case R.id.reset:
    step=0;
    steps.setText(String.valueOf(step));
    }
    return super.onOptionsItemSelected(item);
}
这是我的Myservice课程

public class Myservice extends Service {
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(this,"Pedometer running",Toast.LENGTH_SHORT).show();
    return START_STICKY;
}
@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this,"Pedometer Stopped",Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

}

您正在启动服务,但您正在做活动中的所有事情。因此,您在后台所做的任何事情都应该在服务内部

你可以开始阅读了

也请参考这些示例


  • 您应该删除这个mContext.stopService(newintent(mContext,Myservice.class));从onStop()到后台运行服务,请先阅读本文。你想知道的关于服务的一切就是我把电话拔了。但它仍然不起作用。现在该服务将在后台运行为什么我得到了否决票?所以我必须在Myserice类中使用OnSensorchenglistner?如果你想在后台访问它,你必须非常感谢你,很抱歉我无法投票给你的答案。如果它回答了你的问题,你可以接受答案