OnPause et OnStop() appelée immédiatement après le démarrage de l'activité
J'ai une activité qui doit tourner à l'écran(si off) lorsqu'il est démarré.
Ainsi, dans onCreate, j'ai:
this.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
À l'aide de ce avec l'aide de wakelock dans broadcasr récepteur , je suis capable de provoquer mon activité afin d'afficher toutes les fois qu'il est démarré à partir du récepteur de radiodiffusion.
Mais le problème est très étrange, de l'activité du cycle de vie des appels de cette manière, onPause() et onResume immédiatement après le démarrage de l'activité
- onCreate
- onStart
- onResume
- onPause
- onStop
- onStart
- onResume
De sorte que le problème est sur démarrer et sur le curriculum vitae d'appeler deux fois, sur l'arrête de l'appeler, je veux mettre en œuvre une certaine logique dans onStop() mais, avec un tel comportement de l'application ne fonctionnera pas correctement.
Modifier
J'ai trouvé le problème est dû uniquement à la drapeau FLAG_SHOW_WHEN_LOCKED. et lorsque l'appareil est verrouillé. et il ne se produit que lorsque l'appareil est verrouillé avant l'activité commence.
P. S je suis à l'aide de gestionnaire d'alarme avec récepteur de radiodiffusion, et alors commence une activité de récepteur de radiodiffusion.
- incroyable question, j'ai cela aussi avec le même drapeau
FLAG_SHOW_WHEN_LOCKED
, voté jusqu' - Je l'ai résolu en utilisant un peu de retard dans un gestionnaire, qui vérifie dans onStop
- void onStop() { super.onStop(); if (isDeviceSleeping) { if (System.currentTimeMillis() - startTime < 2000) { return; } }
- ce pourrait être un moyen, mais pas la bonne solution
- Cette réponse m'a sauvé: stackoverflow.com/a/14053686/5247630 c'est au sujet de la détection si l'écran est allumé
- Avez-toi de travail? Je vais avoir le même problème, si j'ai utilisé le réveil verrouiller et désactiver le verrouillage du clavier, il montre que le clavier et s'arrête mon activité
Vous devez vous connecter pour publier un commentaire.
Ici est un important commentaire de code documenté dans ActivityThread, qui est responsable de l'exécution des activités du processus de demande.
Juste après
onResume
, la fenêtre d'activité est fixé à la fenêtre du gestionnaire etonAttachedtoWindow
est invoquée. Si l'écran est activé, la fenêtre d'activité obtiendrez concentrer etonWindowFocusChanged
est invoqué avectrue
paramètre. De docs:Dans la question, l'écran s'éteint. Par conséquent l'activité de la fenêtre ne sera pas obtenir de l'accent, qui résultats dans l'activité de
onPause
méthode appelé suivie paronStop
méthode, que l'activité de la fenêtre n'est pas visible.Depuis
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
indicateur est défini sur l'activité de la fenêtre, la fenêtre du gestionnaire de service se trouve sur l'écran à l'aide de gestionnaire de l'alimentation de l'api. Voici la WindowManagerService code:Après que l'écran s'allume
onStart
etonPause
sont appelés de nouveau.Donc :
onCreate - onStart - onResume - onPause - onStop - onStart - onPause
.Ceci peut être vérifié par le verrouillage de l'appareil et le démarrage de l'activité à l'aide de
adb
de commande oueclipse
.Si vous commencez une tâche dans
onCreate
vous devez vous arrêter dans leonDestory
(si la tâche est toujours en attente). De même pouronStart
il seraitonStop
et pouronResume
il seraitonPause
.Si vous ne pouvez pas suivre le protocole ci-dessus, vous pouvez vérifier le statut de l'activité de la fenêtre à l'aide de hasWindowFocus dans
onPause
méthode. Normalement, l'activité de la fenêtre de statut sera vrai dansonPause
. Dans des scénarios tels que l'écran est éteint ou l'écran est allumé lorsque le clavier est affiché, l'activité de la fenêtre sera faux dansonPause
.onWindowFocusChanged
? Sur la surface, cela semble parfait.La solution de contournement par Manish Mulimani a fonctionné pour moi, sauf que moi j'ai d'abord vérifier les focus de la fenêtre et ensuite appeler grâce à la super.onPause():
Ajouter
android:configChanges="keyboardHidden|orientation|screenSize"
vousActivity
dans votreManifest
. Cela peut résoudre votre problème.Vous avez dit que vous voulez mettre en œuvre une certaine logique dans onStop() mais avec un tel comportement de l'application ne fonctionnera pas correctement. vous n'avez pas de nous montrer exactement ce que vous avez à l'intérieur onStop() mais je pense que votre logique probablement redémarrage de l'activité..
dans ce cas, vous Pouvez mettre en œuvre votre logique dans onStop comme ça:
autre solution qui peut vous aider sera d'éviter onStop() et utiliser onWindowFocusChanged avec bool possèdefocus
J'ai remarqué qu'il y est
activity
attribut dans laAndroidManifest.xml
appeléandroid:showOnLockScreen="true|false"
par exemple:
J'ai cherché sur le web pour sa documentation mais pas de chance, mais à partir de son nom, qu'il doit travailler comme un indicateur de Fenêtre
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
faire.le seul document que j'ai trouvé
Modifier
pouvez vous s'il vous plaît essayez d'appeler votre code du drapeau avant d'appeler
super.onCreate(...)
De l'essayer. J'ai utilisé cette et il fonctionne très bien
Utilisation WakeLocker classe. Il ont des méthodes pour réveiller l'écran sur