java.lang.RuntimeException: impossible de reprendre l’activité avec java.lang.IllegalArgumentException

Récemment, j’ai parfois eu cette exception lorsque MainActivity a appelé onResume ().

java.lang.RuntimeException: Unable to resume activity {com.qau4d.c35s3.androidapp/com.xxx.XXX.XXX.MainActivity}: java.lang.IllegalArgumentException at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1510) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: java.lang.IllegalArgumentException at android.os.Parcel.readException(Parcel.java:1687) at android.os.Parcel.readException(Parcel.java:1636) at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:5475) at android.app.Activity.isTopOfTask(Activity.java:5961) at android.app.Activity.onResume(Activity.java:1252) at com.qau4d.c35s3.androidapp.onResume(XActivity.java:29) at com.qau4d.c35s3.androidapp.onResume(MainActivity.java:196) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269) at android.app.Activity.performResume(Activity.java:6768) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 

Tant dans MainActivity que dans la super classe XActivity , uniquement super.onResume(); . Il est vraiment étrange d’obtenir cette exception après un développement normal de longue date. J’ai vérifié certains documents de référence relatifs mais rien n’a été obtenu.

Il n’y a pas suffisamment d’informations dans votre question pour déterminer la cause de l’exception java.lang.IllegalArgumentException . Malheureusement, ActivityThread ne bloque pas le stacktrace de cette exception et le message d’exception semble être vide.

Cependant, il semble qu’il y ait une voie à suivre. L’exception est gérée par le code suivant dans la méthode ActivityThread::performResumeActivity :

  } catch (Exception e) { if (!mInstrumentation.onException(r.activity, e)) { throw new RuntimeException( "Unable to resume activity " + r.intent.getComponent().toShortSsortingng() + ": " + e.toSsortingng(), e); } } 

Si vous enregistrez une classe d’ Instrumentation pour votre activité, il devrait être possible d’utiliser une méthode onException pour enregistrer la trace de l’exception causale. Une autre possibilité consiste à utiliser Thread.setUncaughtExceptionHandler pour définir un gestionnaire pour le thread dans lequel l’ IllegalArgumentException est lancée.

Cela ne résoudra pas le problème (!) Mais vous permettra de vous rapprocher d’une solution.

Dans la méthode Activity # isTopOfTask on peut voir:

 private boolean isTopOfTask() { if (mToken == null || mWindow == null) { return false; } try { return ActivityManager.getService().isTopOfTask(getActivityToken()); } catch (RemoteException e) { return false; } } 

Et dans ActivityManagerService # isTopOfTask on peut trouver:

 @Override public boolean isTopOfTask(IBinder token) { synchronized (this) { ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { throw new IllegalArgumentException(); } return r.task.getTopActivity() == r; } } 

Donc, je pense que ActivityRecord est nul.Mais je ne sais pas pourquoi il est nul ….