How to clear a notification if activity crashes?

2019-02-14 04:11发布

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.

3条回答
迷人小祖宗
2楼-- · 2019-02-14 04:38

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.

查看更多
倾城 Initia
3楼-- · 2019-02-14 04:42

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).

查看更多
孤傲高冷的网名
4楼-- · 2019-02-14 04:46

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);
  }
}
查看更多
登录 后发表回答