How to detect app removed from the recent list?
Asked Answered
R

3

22

I'm working on a music app, and I want stop the service when user removes the application from the recent list and not when the first activity is destroyed(because when user clicks back back until app minimizes, in that case first activity is also getting destroyed). Please help.

Rhodian answered 16/12, 2014 at 6:9 Comment(0)
L
53

I want stop the service when user removes the application from the recent list.

Yes, you can either do that using stopWithTask flag as true for Service in Manifest file.

Example:

<service
    android:enabled="true"
    android:name=".MyService"
    android:exported="false"
    android:stopWithTask="true" />

OR

If you need event of application being removed from recent list, and do something before stopping service, you can use this:

<service
    android:enabled="true"
    android:name=".MyService"
    android:exported="false"
    android:stopWithTask="false" />

So your service's method onTaskRemoved will be called. (Remember, it won't be called if you set stopWithTask to true).

public class MyService extends Service {

    @Override
    public void onStartService() {
        //your code
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        System.out.println("onTaskRemoved called");
        super.onTaskRemoved(rootIntent);
        //do something you want
        //stop service
        this.stopSelf();
    }
}

Hope this helps.

Longevous answered 16/12, 2014 at 6:14 Comment(7)
While this perfectly answers the question, it does feel like it's not the best approach for a music app. Especially, if I want to do other stuff while still listening to music. I would strongly consider using a combination of a "Started"/"Bound" service with ongoing notificationsAwake
@Mystic Magic how can i stop playing music using media player as i have start playing sound from onRecieve of alarmclass extends with wakefulbroadcastrecieverKuebbing
why onTaskRemoved not called i implement same as you mention aboveAlfaro
@nileshprajapati what device did you test it on?Repute
This will no longer work on API level >=26 because of background services limitation - developer.android.com/about/versions/oreo/background#servicesSpindling
@VadimKotov Background services would be active for a minute in API level > 26.Handful
@Longevous Its not working for me.I am using api 27Ul
K
2

The last answer didn't work for me (I am using API 29). I looked up in the Javadoc of the onTaskRemoved function and saw the following instruction: "If you have set {android:stopWithTask}, then you will not receive this callback; instead, the service will simply be stopped."

So, all I got to do is to remove this line (android:stopWithTask="false") from the manifest and it worked just fine.

This is the updated code in the manifest file:

<service
android:enabled="true"
android:name=".ExitService"
android:exported="false"/>
Keystone answered 22/8, 2020 at 18:3 Comment(0)
S
1

Im posting this answer, since the chosen as best solution was not working for me.

This is the updated version:

First create this service class:

 public class ExitService extends Service {


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        System.out.println("onTaskRemoved called");
        super.onTaskRemoved(rootIntent);
        //do something you want before app closes.
        //stop service
        this.stopSelf();
    }
}

Then, declare this way your service in the manifest label:

<service
            android:enabled="true"
            android:name=".ExitService"
            android:exported="false"
            android:stopWithTask="false" />

Now, just start the service wherever you want to do something before your app closing.

 Intent intent = new Intent(this, ExitService.class);
        startService(intent);
Sunk answered 13/3, 2018 at 23:30 Comment(3)
onTaskRemoved isn't called on API=26 OreoPhony
@user1269737 In my case it is getting called if stopWithTask is set to falseHandful
@Sunk Its not working for me.I am using api 27Ul

© 2022 - 2024 — McMap. All rights reserved.