IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

startActivity depuis BroadcastReceiver SDK >=26


Sujet :

Android

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut startActivity depuis BroadcastReceiver SDK >=26
    Bonjour

    Je migre une application vers Android 9 qui tourne sans problème sur Android7.

    J'ai bien noté qu'apparait la notion de Channel pour les intents, et j'arrive sans problème à faire passer mon service en avant-plan en utilisant ces nouvelles fonctionnalités.
    J'arrive aussi à démarrer un service directement depuis le BroadcastReceiver sur l'action "Intent.ACTION_BOOT_COMPLETED" puis à le faire passer en avant-plan

    Cependant, impossible d'arriver à démarrer mon activité principale, j'ai essayé un peu tous les moyens, et ça ne fonctionne pas: je ne trouve pas l'astuce.

    J'arrive bien dans mon BroadcastReceiver en fin de boot (j'ai un log dans room qui me le confirme), mais l'activité ne se lance pas. Si je lance le service, par contre, ça fonctionne (mais ça ne m'arrange pas).

    Bref, ceci fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               context.startForegroundService(Intent(context, ServiceMe::class.java))
    Mais pas ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    val intent = Intent(context, MainActivity::class.java)
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                context.startActivity(intent)
    Si quelqu'un dispose d'un bout de code pour démarrer une activité en SDK >=26 sur un BroadcastReceiver, ce serait sympa.

    Merci d'avance,
    Claude

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Je me fais une première partie de réponse, si ça servait à d'autres, sans compter que mon problème n'est pas résolu

    Mon problème principal est provoqué par Room. En effet, j'ai dans ma BDD (qui sert surtout pour les logs) une table "PrefsEntity" qui contient les préférences utilisateur. Dans cette table j'ai le boolean "autostart" qui détermine si l'application doit ou non se relancer au reboot de la machine (c'est une application domotique qui est la seule à tourner sur ce device). J'ai donc, dans mon BroadcastReceiver, pour l'évènement "ACTION_BOOT_COMPLETED", un code du genre (désolé c'est du Kotlin, mais bon ça reste compréhensible pour tous):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                            val bdd = MainDatabase(context)
     
                            val prefs = bdd.PrefsDao().readBlockingPrefs()
                            val autostart = prefs.autoStart
     
                            if (autostart)
                            {
                                val newintent = Intent(context, MainActivity::class.java)
                                newintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                                context.startActivity(newintent)
                            }
    Ce code fonctionne parfaitement sur Android <= 7 mais ne fonctionne pas sur un appareil sous Android 9.
    J'ai donc ajouté des logs dans ma BDD pour voir ce qui coince, comme ceci (le "specialInsert", c'est juste un @Insert bloquant que j'ai mis juste pour l'occasion: attente du retour avant de poursuivre)
    Le "ReadBlockingPrefs" récupère les settings utilisateur dans une PrefsEntity, en attendant le résultat (donc bloquant aussi):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                            val bdd = MainDatabase(context)
                            bdd.LogDao().specialInsert(LogEntity("Step1",MessageLevel.MSG_WARNING))
     
                            bdd.LogDao().specialInsert(LogEntity("Step2",MessageLevel.MSG_WARNING))
     
                            val prefs = bdd.PrefsDao().readBlockingPrefs()
     
                            bdd.LogDao().specialInsert(LogEntity("Step3",MessageLevel.MSG_WARNING))
     
                            val autostart = prefs.autoStart
                            bdd.LogDao().specialInsert(LogEntity("Step4",MessageLevel.MSG_WARNING))
     
                           ...
    Le résultat sur un device <= 7 est bien entendu l'affichage de Step1 à Step4 et l'application démarre
    Le résultat sur un device == 9 c'est que j'ai Step1,Step2 et Step3 mais PAS Step4 (thread définitivement bloqué).
    Moralité, je récupère bien ma PrefsEntity mais dès que je veux l'utiliser je bloque le thread complet (j'ai testé en forçant l'exécution dans le thread UI et c'est clair que tout est alors bloqué).

    Et ce, UNIQUEMENT si j'effectue ces opérations dans un thread séparé, sinon ça tourne en Android 7 mais en Android 9 je n'ai même pas le premier log


    Bref, ça ressemble furieusement à un bug au niveau de Room: Quelqu'un a une idée?

    Au passage, c'est toujours intéressant de savoir que ceci fonctionne sur Android 7 mais pas sur Android 9:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                                newintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    Sous Android9 on est obligé d'utiliser ce flag pour que ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                                newintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    Merci d'avance pour la réponse.
    J'ai solutionné mon problème en utilisant un SharedPreference pour mon autostard si le SDK >= 26 mais évidemment ça n'explique pas pourquoi ça ne fonctionne pas avec room

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Après des séries d'essais, il est manifeste qu'il y a problème à utiliser room au niveau du BroadcastReceiver. Donc, j'ai utilisé un SharedPrefs pour ce paramètre particulier afin de contourner ce curieux problème.
    Cette info au cas où quelqu'un d'autre rencontrerait un problème similaire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Agir sur une Activity depuis BroadCastReceiver
    Par Jose.N70 dans le forum Android
    Réponses: 2
    Dernier message: 11/09/2014, 15h09
  2. startActivity depuis une PreferenceActivity
    Par Simon MARQUIS dans le forum Android
    Réponses: 5
    Dernier message: 05/10/2011, 13h42
  3. Réponses: 3
    Dernier message: 31/03/2008, 10h24
  4. Accéder depuis J2EE SDK 1.4 à Oracle 9i Database Release 2
    Par thomas_le_debutant dans le forum Oracle
    Réponses: 1
    Dernier message: 22/03/2006, 21h38
  5. Accéder depuis J2EE SDK 1.4. à Oracle 9i Database Release 2.
    Par thomas_le_debutant dans le forum Oracle
    Réponses: 5
    Dernier message: 18/03/2006, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo