Die Verwendung von FLAG_ACTIVITY_REORDER_TO_FRONT zum Wechseln zwischen permanent ausgeführten UI-Aktivitäten führt zum Fehler "Kein Fensterfokus"

8

Mein Ziel ist es, zwei UI-Aktivitäten am Leben zu erhalten und zwischen ihnen hin und her zu wechseln, ohne einen von beiden zu töten / neu zu starten. Es gibt jedoch einen schwerwiegenden Nebeneffekt der Verwendung von FLAG_ACTIVITY_REORDER_TO_FRONT : ein Verlust des Fensterfokus beim Fortsetzen einer vorherigen Aktivität (die derzeit im Hintergrund ausgeführt wird).

Ich habe dieses Problem bewiesen, indem ich fünf Minuten lang eine einfache Anwendung mit zwei "Hallo Welt" -Aktivitäten erstellt habe.

  1. Die App beginnt mit der Aktivität A, die einfach eine Schaltfläche (nichts anderes) namens "Launch B" anzeigt.
  2. Drücken Sie diese Taste - dies führt startActivity(FLAG_ACTIVITY_REORDER_TO_FRONT, ActivityB.class). aus
  3. Aktivität B wird aktiv, die zeigt einfach eine Schaltfläche namens "Launch A".
  4. Drücken Sie diese Taste - dies führt startActivity(FLAG_ACTIVITY_REORDER_TO_FRONT, ActivityA.class). aus
  5. Activity A's onResume() wird wie erwartet aufgerufen und alles sieht gut aus (Ich kann den Inhalt von Aktivität A wieder sehen).
  6. Drücken Sie die Zurück-Taste des Geräts, und dieser Satz von Fehlern tritt zu 100% auf:
  

E / ActivityManager (513): Grund: Zeitüberschreitung bei der Eingabeübermittlung (Waiting   weil kein Fenster den Fokus hat, aber es gibt eine fokussierte Anwendung, die   kann eventuell ein Fenster hinzufügen, wenn der Startvorgang abgeschlossen ist.)

     

I / WindowState (513): WIN DEATH: Fenster {5294687c u0   com.android.launcher / com.android.launcher2.Launcher}

     

W / ViewRootImpl (8066): Löschen eines Ereignisses aufgrund eines fehlenden Fensterfokus :   KeyEvent {action = ACTION_DOWN, Schlüsselcode = KEYCODE_BACK, scanCode = 0,   metastate = 0, Flags = 0xc8, repeatCount = 1, eventTime = 14965546,   downTime = 14965045, deviceId = -1, source = 0x101}

(Das praktische Ergebnis des Fensters Tod ist im Wesentlichen ein "Absturz" aus der Sicht des Benutzers - Android wirft den Benutzer aus der App zurück auf den Startbildschirm, obwohl die Anwendung technisch im Hintergrund läuft.)

Ich debuggte dies und fand heraus, dass der Grund, warum Aktivität A sichtbar ist, aber keinen Fokus hat, darin liegt, dass Aktivität onWindowFocusChanged () nicht wie normalerweise aufgerufen wird (obwohl onResume () aufgerufen wird) ). Das hat etwas damit zu tun, dass Aktivität B im Hintergrund aktiv ist (obwohl B eindeutig den Fokus verloren hat - onWindowFocusChanged (false) wurde für B aufgerufen, ebenso wie onStop ()) . Ich weiß das, weil ich nach Schritt 4, wenn ich in Aktivität B sofort finish () anrufe, Aktivität von onWindowFocusChanged (true) aufgerufen wird und alles normal ist. Die Tatsache, dass Aktivität B noch aktiv ist, aber nicht Der Fokus konzentriert sich irgendwie auf Aktivität A, die wieder scharf wird, wie es sollte. Ist das ein Android-Bug oder fehlt mir etwas?

Beachten Sie, dass, wenn Aktivität A mehrere Ansichten darin hatte und ich eine dieser Ansichten nach Schritt 6 oben berühren sollte, würde ich den gleichen "Drop-Ereignis wegen keinem Fensterfokus" -Fehler bekommen, obwohl nicht 100% der Zeit aus irgendeinem Grund.

    
Steve B 17.03.2015, 23:00
quelle

1 Antwort

1

Die in Ссылка zur Verfügung gestellte Problemumgehung hat mir sehr geholfen, das Problem zu lösen Problem der Aktivität wird nicht Fenster Fokus:

%Vor%

Dies erfordert auch die Erlaubnis in AndroidManifest.xml

%Vor%

Ich habe dieses Problem tatsächlich in Espresso test mit einem solchen Fehler festgestellt:

java.lang.RuntimeException: Waited for the root of the view hierarchy to have window focus and not be requesting layout for over 10 seconds. If you specified a non default root matcher, it may be picking a root that never takes focus. Otherwise, something is seriously wrong.

    
riwnodennyk 06.04.2016 10:49
quelle

Tags und Links