Si mon application plante (la raison est sans importance - peut être un problème matériel, une mémoire insuffisante, etc.), Android démarre toujours mon application lors de la dernière activité. L'application est utilisée par les personnes qui visitent un bureau pour des rendez-vous. Lorsque le client arrive, la réception déverrouille l'application à l'aide d'un code pour ce client, puis le client procède à plusieurs activités. Il existe donc un contexte client nécessaire pour toutes les activités de l'application, à l'exception de l'écran de déverrouillage initial. Par conséquent, l'application doit revenir à l'écran de démarrage si l'application se bloque pour une raison quelconque, mais Android revient toujours à la dernière activité.
Il semble que cela devrait être très facile à faire, mais Android redémarre "utilement" la dernière activité utilisée, qui ne peut pas continuer sans le contexte client. Plutôt que d'écrire un tas de code pour détecter si l'application a redémarré après un crash, je préférerais qu'elle revienne à l'activité principale à chaque fois. J'ai regardé les options de manifeste clearTaskOnLaunch et launchMode, mais elles ne semblent pas fonctionner après des plantages. J'ai un UncaughtExceptionHandler sur chaque thread, mais certains plantages (par exemple dans le code natif) mettent simplement fin à l'application sans l'invoquer.
Oui, je pourrais regrouper l'état du client et le restaurer après un crash, mais je ne veux pas sérialiser des informations potentiellement sensibles, et cela semble être quelque chose que le système d'exploitation prendrait simplement en charge car cela semble si basique.
Ok, j'attends maintenant que quelqu'un me dise une solution incroyablement évidente que j'ai manquée ...
Merci.
L'évident (LOL)
Mettez android:clearTaskOnLaunch="true"
dans votre mainifest:
<activity android:name=".StartActivity"
android:clearTaskOnLaunch="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
savedInstanceState()
est utilisé lorsqu'une activité est interrompue de force par le système d'exploitation et d'autres choses, c'est-à-dire:
Lorsque cela se produit, onSaveInstanceState(Bundle outstate)
sera appelé et c'est à votre application d'ajouter les données d'état dans lesquelles vous souhaitez enregistrer outstate
.
Les données ne sont conservées en mémoire que pendant que l'application est active, c'est-à-dire que ces données sont perdues lorsque l'application se ferme normalement.
Les choses pas si évidentes (approche de la force brute [unsubtle])
Après le crash, vérifiez l' savedInstanceState
objet sur la onCreate
méthode de TOUTES les activités qui pourraient planter, et si ce n'est pas le cas null
(cela signifie qu'il est redémarré par le système Android), terminez l'activité (peut-être relancer? ).
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
finish();
}
}
REMARQUE Une activité est également redémarrée lors des changements de configuration (par exemple, la rotation), donc si vous utilisez la rotation automatique, vous devez vivre avec un redémarrage ou un code correspondant (pas trop dur).
Trucs avancés
Utilisez UncaughtExceptionHandler()
sur chaque thread java android ET ExceptionHandler()
code natif si vous utilisez natif (peut-être avec le rappel JNI vers java).
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots