点击后服务不会停止

时间:2013-12-18 09:10:26

标签: java android android-service togglebutton

我点击了一个切换按钮后启动了一项服务。它运作良好,但当我再次点击切换时,我希望服务停止但不起作用。服务还在继续。这是按钮(我使用首选项来保存按钮的状态):

check = (ToggleButton)v.findViewById(R.id.check1);
final SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE);
boolean tgprefshake = preferences.getBoolean("tgprefshake", false);  //default is true
check.setOnCheckedChangeListener(new OnCheckedChangeListener() {                
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked){ //do this}
              Log.d("Service", "onClick: starting srvice");
              myService = new Intent(getActivity(), shakeService.class);
              //getActivity().startService(new Intent(getActivity(), shakeService.class));
              getActivity().startService(myService);                         
              SharedPreferences.Editor editor = preferences.edit();
              editor.putBoolean("tgprefshake", true); // value to store
              editor.commit();
          } else {  
              Log.d("Service", "onClick: stopping srvice");
              //getActivity().stopService(new Intent(getActivity(), shakeService.class));
              getActivity().stopService(myService);

              SharedPreferences.Editor editor = preferences.edit();
              editor.putBoolean("tgprefshake", false); // value to store
              editor.commit();
          }
    }
});

if (tgprefshake) //if (tgpref) may be enough, not sure
{
    check.setChecked(true);
}
else
{
    check.setChecked(false);
}

服务:

public class shakeService extends Service implements SensorEventListener{
    // Sensors
    public SensorManager sensorManager;
    private long lastUpdate;
    public ToggleButton check ;
    public Sensor mAccelerometer;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate()
    {
        Log.d("", "onCreate");
        super.onCreate();   
    }
    public void onDestroy() {
        Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
            Log.d("Service", "onDestroy");
    }
    public void onStart(Intent intent, int startId)
    {
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_NORMAL);
        lastUpdate = System.currentTimeMillis();
    }
    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onSensorChanged(SensorEvent event) {    
        // TODO Auto-generated method stub   
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            getWifiVibrating(event); 
        }

    }
    private void getWifiVibrating(SensorEvent event) {
        //myVib.vibrate(50);
        final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        float[] values = event.values;
        // Movement
        float x = values[0];
        float y = values[1];
        float z = values[2];

        float accelationSquareRoot = (x * x + y * y + z * z)
            / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
        long actualTime = System.currentTimeMillis();
        if (accelationSquareRoot >= 3) {
          if (actualTime - lastUpdate < 600) {
            return;
          }
          lastUpdate = actualTime;
          wifiManager.setWifiEnabled(true);
          Toast.makeText(this, "Wi-fi On", Toast.LENGTH_SHORT)
          .show();
    } 
}

public void onResume() {

    // register this class as a listener for the orientation and
    // accelerometer sensors
    sensorManager.registerListener(this,
    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
    SensorManager.SENSOR_DELAY_NORMAL);
}

public void onPause() {
    // unregister listener
    sensorManager.unregisterListener(this);
}

错误在哪里?当我关闭切换按钮时,它会显示“Service Stopped”,但服务仍然有效。

3 个答案:

答案 0 :(得分:2)

在服务的onDestroy()实现结束时调用super.onDestroy()。

答案 1 :(得分:1)

您是否考虑过内存泄漏?每次onResume,U都会将服务注册为监听器。

答案 2 :(得分:0)

stopService()无法在android中立即停止服务。系统将在适当的时间完全停止。