Emiliano
Emiliano

Reputation: 141

How to destroy/kill a service?

I have my application running a service for shake detect, however in my MainActivity, I have button for log out user, in which I must log out and terminate the service that detects the shake event.

my method for log out in my MainActivity is:

public void signOutAndFinish(){
    //Stop Shakeservice
    Intent intent = new Intent(this, ShakeService.class);
    stopService(intent);
    //Go to login activity
    Intent iLoginView = new Intent(this, LoginActivity.class);
    startActivity(iLoginView);
}

however if I shake my device after logging out, the service recognizes the shake, it is as if it will not kill it immediately:

Intent intent = new Intent(this, ShakeService.class);
stopService(intent);

The code in the method onDestroy is:

@Override
public void onDestroy() {
    super.onDestroy();
}

How can I terminate the service so that when I log out the service dies?

Thanks for your help!

Upvotes: 1

Views: 342

Answers (2)

CommonsWare
CommonsWare

Reputation: 1006664

however if I shake my device after logging out, the service recognizes the shake

Then presumably you did not clean up your Sensor stuff in the service's onDestroy() method.

How can I terminate the service so that when I log out the service dies?

You are doing that now. However, if you set up something in the service, such as listening to events from SensorManager, you need to clean that up, typically in onDestroy() of the service.

Upvotes: 0

madlymad
madlymad

Reputation: 6530

You can send a broadcast back your activity in the onDestroy() method of your service and then do the logout.

Here is some sample code of the above idea:

This for your service:

@Override
public void onDestroy() {
    super.onDestroy();
    Intent intent = new Intent();
    intent.setAction("com.example.broadcast.MY_NOTIFICATION");
    intent.putExtra("data","Notice for logout!");
    sendBroadcast(intent);
}

And this is for your activity:

private BroadcastReceiver br = new MyBroadcastReceiver();

@Override
public void onCreate() {
  IntentFilter filter = new IntentFilter("com.example.broadcast.MY_NOTIFICATION");
  registerReceiver(br, filter);
}

@Override
public void onDestroy() {
  unregisterReceiver(br);
}

// An inner class at your activity
public class MyBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "MyBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        YourActivity.this.finish();
        // or do anything you require to finish the logout...
    }
}

Upvotes: 1

Related Questions