Comment puis-je m'assurer que mon application Android démarre toujours sur l'activité principale, même si elle plante?

Greg Taylor

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.

Jon Goodwin

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 votre activité est en arrière-plan et qu'une autre tâche nécessite des ressources
  • plantage de l'application
  • changement d'orientation
  • PAS lorsque l'utilisateur appuie sur le bouton «forcer la fermeture» dans les paramètres

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' savedInstanceStateobjet sur la onCreatemé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.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Filtrer le dataframe basé sur plusieurs colonnes d'un autre dataframe

  2. 2

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  3. 3

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  4. 4

    Comment envoyer plusieurs variables de la lame au contrôleur

  5. 5

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  6. 6

    Microsoft.WebApplication.targets

  7. 7

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  8. 8

    System.Data.SqlClient.SqlException: 'Nom de colonne non valide' ApplicationRoleId '.'

  9. 9

    Comment définir du texte dans un QLabel et afficher les caractères '<>'?

  10. 10

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

  11. 11

    Concaténer des variables dans ansible

  12. 12

    Comment centrer un div tout en utilisant la transition et transformer avec l'échelle

  13. 13

    Filtrer les données en fonction des conditions d'une trame de données

  14. 14

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  15. 15

    ESP8266 HADRWARE MINUTERIE, USA pour cocher une macro étrange

  16. 16

    comment afficher un bouton au-dessus d'un autre élément ?

  17. 17

    php ajouter et fusionner des données de deux tables

  18. 18

    Stop jQuery execution after one time execution

  19. 19

    Pourquoi Phantomjs ne fonctionne pas avec ce site ?

  20. 20

    obtenir le nombre de marqueur affiché sur la carte

  21. 21

    Redirection HTTP vers HTTPS dans Java à l'aide de HTTPURLConnection

chaudétiquette

Archive