Window-Flags werden nur 1x berücksichtigt

  • Antworten:2
  • Bentwortet
pepperonas
  • Forum-Beiträge: 434

04.11.2014, 17:14:00 via Website

Hallo,

ich staue mal wieder darüber wie inkonsistent das Android-System an manchen Stellen doch ist.

Problemstellung:
Ich lasse einen Service laufen, starte von dort eine Activity und möchte, dass diese in den Vordergrund kommt - egal ob das Handy im Lockscreen, oder eine andere Anwendung an zeigt.

Hier der Code, den ich dafür einsetze:

// ist der Bildschirm gesperrt, wecken wir das Gerät auf
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Damit das funktioniert setze ich ein paar WindowFlags. Das funktioniert soweit sehr gut.
Aber sobald ich zum wiederholten Male die Logik ausführe, entsperrt sich der Bildschirm nicht mehr. Wie kann das sein?! Habe auch schon versucht die Flags zurückzusetzen - ohne Erfolg. Eine Methode removeFlags() o.Ä. ist sowieso nicht vorgesehen, deswegen habe ich es mit diesem Code versucht:

MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD & ~WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
                    MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED & ~WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
                    MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON & ~WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Wenn mich nicht alles täuscht, sollte man damit doch die gesetzten Flags invertieren, oder habe ich einen "boolschen Denkfehler"?!

Ziel soll wie gesagt sein, dass das Gerät immer aufgeweckt wird, wenn die Activity gestartet wird.

Danke vorab und beste Grüße
Martin

NACHTRAG:
Eine "Auffälligkeit" habe ich noch herausgefunden... Wenn ich die geöffnete Activity mit Drücken des Homebuttons in den Hintergrund bringe und dann das Gerät sperre, wird beim nächsten Entsperren, alles wieder korrekt durchgeführt.
Die Flags in onResume zu setzen hat ebenfalls keinen Erfolg gebracht. Hmm...

Nachtrag 2:
Wenn man vorher einen WakeLock setzt, wird der Bildschirm immer entsperrt, also so wie es sein soll. (ziemlich seltsam - wüsste nicht warum, da ja die Activity bereits im Vordergrund war - nur halt nicht sichtbar - als besagter "Fehler" auftrat)

hier der Code:

// WakeLock um sicher gehen zu können, dass der Bildschrim auch entsperrt wird, wenn
// MainActivity bereits im Vordergrund war. 
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "bbbb");
wakeLock.acquire();

// ist der Bildschirm gesperrt, wecken wir das Gerät auf
MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

— geändert am 04.11.2014, 18:03:13

Open Source

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.11.2014, 17:24:57 via Website

Kann es sein, dass die Activity noch irgendwo im Hintergrund offen gehalten wird, das könnte nämlich zu deinem Fehler führen, da ich annehme dass window flags pro Activity nur einmal wirken.
Macht denn dein Intent immer eine neue Activity oder ruft sie nur die alte in den Vordergrund wenn eine existiert?
Zudem: Was macht es für sinn dass der Bildschrirm entsperrt wird?
Das ist doch dann 100%sicherheitsrisiko, da man darüber ja auch vor ort unbefugt ohne Pin etc. darauf zugreifen kann.
Oder wird der Screen nur für deine App entsperrt und sperrt sich wieder sobald sie verlassen wird?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
pepperonas
  • Forum-Beiträge: 434

04.11.2014, 18:08:03 via Website

Hallo,
die Activity ist definitiv noch offen... bzw. der Service öffnet sie ja. onNewIntent wird zuverlässig ausgeführt, nur die Flags halt nur 1x gesetzt. Deswegen habe ich es jetzt mit einem WakeLock gemacht.

Jo, der Nutzer kann selbst entscheiden, ob er den Bildschirm automatisch wieder gesperrt haben möchte oder nicht. Dafür muss er allerdings den Device-Admin für die Sperrung des Bildschirms setzen.

Hehe, "Sicherheitsrisiko" ist gut.. Meine Anwendung hat den Zweck den Nutzer optisch wie akustisch zu warnen (komme was wolle) und mit diesem Wissen nutzt er die App hoffentlich auch ^^

Open Source

Antworten