Ali
Ali

Reputation: 2042

Destroy foreground notification when the service get killed

I have a foreground service to download some contents form the web.

Unfortunately, due to bug which reported here my service being killed when a receiver received a broadcast within my service but it's notification won't be killed and I saw the following log in my logcat:

I/ActivityManager(449): Killing 11073:my-package-name/u0a102 (adj 0): remove task

Is there anyway to to destroy foreground notification when it's parent service get killed by OS?

Upvotes: 5

Views: 2890

Answers (6)

bgplaya
bgplaya

Reputation: 1155

Inside the notification check periodically (e.g. Handler) if service is still running using code below:

public static boolean isMyServiceRunning(Context context) {
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))                           {
        if (MyService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

And if not just shut down notification.

private static final int DEALY = 10000;
private Handler handler = new Handler();

...
handler.postDelayed(ensureSericeIsRunning, DELAY);
...

private Runnable ensureSericeIsRunning = new Runnable() {

    @Override
    public void run() {
        if (!isMyServiceRunning(getActivity())){
            //shut down notification
        } else {
            handler.postDelayed(ensureSericeIsRunning, DELAY);
        }
    }
};

Upvotes: 1

Sagar Pilkhwal
Sagar Pilkhwal

Reputation: 3993

Use stopForeground:

@Override
public void onDestroy() {
 // as the bug seems to exists for android 4.4
 if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.KITKAT)
 {
    stopForeground(true);
 }
  super.onDestroy();
}

or

public void onTaskRemoved (Intent rootIntent)
{
 // as the bug seems to exists for android 4.4
 if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.KITKAT)
 {
   stopForeground(true);
 }
}

Upvotes: 1

danny117
danny117

Reputation: 5651

Service ending remove the foreground notification.

@Override
public void onDestroy() {
    // mycleanup first
    stopForeground(true);
    super.onDestroy();
}

Upvotes: 1

jinnybrain
jinnybrain

Reputation: 30

use the service onTaskRemoved() method.

Upvotes: 0

Kosh
Kosh

Reputation: 6334

You could remove the notification from onStop or onDestroy inside of your service class. P.S there no guarantee this would work, in api 14 and above the service can still be running even without foreground notification, you could return START_STICKY that will bring back your service even if the system destroyed it, system will restart it.

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

Upvotes: 0

Christopher Francisco
Christopher Francisco

Reputation: 16268

use onDestroy(). Even tho the documentation says it is not guaranteed to be called, I have tested multiple times and the only cases it doesn't get called is when the system kills the process, but to that point your notification will be killed to, so it's ok.

Upvotes: 0

Related Questions