Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to clear a notification if activity crashes?

In my app, I'm creating a notification with the FLAG_ONGOING_EVENT flag set as such..

Notification notification = new Notification(iconId, text, System.currentTimeMillis());  
notification.flags |= Notification.FLAG_ONGOING_EVENT;

I'm cancelling the notification in onDestroy, but if my app crashes before calling onDestroy, is there any way to have my notification go away?

Rob W.

like image 796
brockoli Avatar asked Oct 26 '10 22:10

brockoli


3 Answers

Everything crashes, even Google applications. I use Thread.setUncaughtExceptionHandler() and the following handler code:

package my.package;

import java.lang.Thread.UncaughtExceptionHandler;

import android.app.NotificationManager;
import android.content.Context;

public class CrashHandler implements UncaughtExceptionHandler
{
  private static final int NOTIFICATION_ID = 12345;

  private UncaughtExceptionHandler defaultUEH;
  private NotificationManager notificationManager;

  public CrashHandler(Context context)
  {
    this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
  }

  public void uncaughtException(Thread t, Throwable e)
  {
    if (notificationManager != null)
    {
      try
      {
        notificationManager.cancel(NOTIFICATION_ID);
      }
      catch (Throwable ex)
      {
        ex.printStackTrace();
      }
    }
    notificationManager = null;

    defaultUEH.uncaughtException(t, e);
  }
}
like image 59
Andrey Novikov Avatar answered Oct 14 '22 09:10

Andrey Novikov


This is more or less the same question as Callback before Force Close of Android Activity?, so I'll repeat my answer here:

I would recommend not having your app crash in the first place. If there's something that COULD crash, just put a try/catch around it and handle it properly.

Or, as some sort of global try/catch, you can use Thread.setUncaughtExceptionHandler(). Finally, you could even consider Runtime.addShutdownHook, but that's most likely a bad idea.

Fix your crashes. That's the only sane solution.

like image 5
EboMike Avatar answered Oct 14 '22 10:10

EboMike


No. When your app crashes, there's nothing that can be done after the crash! Either catch the exception and deal with it then (although catch Exception e {...} is an extremely bad idea), or make your app not crash (this would be a good tactic in my opinion).

like image 2
fredley Avatar answered Oct 14 '22 09:10

fredley