Das hat mich schon eine Weile verrückt gemacht.
Gibt es eine Möglichkeit, zuverlässig zu erkennen, ob die Home-Taste in einer Android-Anwendung gedrückt wurde?
Wenn dies nicht der Fall ist, gibt es eine zuverlässige Methode, um festzustellen, warum eine Aktivität in onPause gestartet wurde? dh Können wir feststellen, ob dies durch den Start einer neuen Aktivität oder durch Drücken von Zurück / Nach Hause verursacht wurde?
Ein Vorschlag, den ich gesehen habe, ist, onPause () zu überschreiben und isFinishing () aufzurufen. Dies gibt jedoch false zurück, wenn die Home-Taste gedrückt wird, genau wie beim Starten einer neuen Aktivität, sodass zwischen beiden nicht unterschieden werden kann.
Jede Hilfe sehr geschätzt.
** Update **: Danke an @ android-hungrig für diesen Link: https://nishandroid.blogspot.com/
Überschreiben der folgenden Methode:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
Dann wird das folgende Ereignis für das Drücken der Home-Taste ausgelöst:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
//The Code Want to Perform.
}
});
Ich bin nicht sicher, ob es irgendwelche Nebenwirkungen mit dieser Linie gibt:
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
Es scheint also, dass Sie entgegen der landläufigen Meinung tatsächlich auf den Home-Schlüssel achten können. Besorgniserregend ist, dass Sie false zurückgeben und den Home-Schlüssel nichts tun lassen können.
Update : Wie erwartet gibt es einige Nebenwirkungen - es scheint, dass eingebettete Videos und Google Maps bei aktiviertem Modus nicht sichtbar sind.
Update : Angeblich funktioniert dieser Hack ab Android 4.0 nicht mehr
quelle
Activity.onUserLeaveHint()
.Antworten:
Der folgende Code funktioniert für mich :)
quelle
onHomeLongPressed
scheint tatsächlich der Eröffnung der Systemaktivität "Letzte" zu entsprechen. Auf meinem Telefon wird dies durch Drücken der letzten Taste neben der Home-Taste ausgelöst, sodass die Annahme Ihres Codes, dass es sich um eine lange Home-Taste handelt, nicht immer korrekt ist.final String SYSTEM_DIALOG_REASON_LONG_PRESS = "assist"
Dies ist eine alte Frage, aber sie könnte jemandem helfen.
Gemäß der Dokumentation wird die onUserLeaveHint () -Methode aufgerufen, wenn der Benutzer auf die Home-Schaltfläche klickt ODER wenn etwas Ihre Anwendung unterbricht (wie ein eingehender Anruf).
Das funktioniert bei mir .. :)
quelle
Es ist unmöglich, die HOME-Schaltfläche in einer Android-App zu erkennen und / oder abzufangen. Dies ist in das System integriert, um schädliche Apps zu verhindern, die nicht beendet werden können.
quelle
Ich musste Hintergrundmusik in meiner Anwendung starten / stoppen, wenn die erste Aktivität geöffnet und geschlossen wird oder wenn eine Aktivität über die Home-Schaltfläche angehalten und dann vom Task-Manager fortgesetzt wird. Die reine Wiedergabe wurde angehalten / fortgesetzt
Activity.onPause()
undActivity.onResume()
die Musik für eine Weile unterbrochen, sodass ich den folgenden Code schreiben musste:Dies unterbricht die Wiedergabe nur, wenn die Anwendung (alle ihre Aktivitäten) geschlossen ist oder wenn die Home-Taste gedrückt wird. Leider ist es mir nicht gelungen, die Reihenfolge der Aufrufe der
onPause()
Methode deronResume()
Startaktivität und der gestarteten Aktivität zu ändern, wenn sieActivity.startActivity()
aufgerufen wird (oder zu erkennen,onPause()
dass in dieser Aktivität eine andere Aktivität auf andere Weise gestartet wird), sodass dieser Fall speziell behandelt werden muss:Ein weiterer Nachteil ist, dass hierfür eine
GET_TASKS
Genehmigung erforderlich istAndroidManifest.xml
:Das Ändern dieses Codes, der nur beim Drücken der Home-Taste reagiert, ist unkompliziert.
quelle
Überschreiben Sie
onUserLeaveHint()
die Aktivität. Es wird niemals einen Rückruf zu der Aktivität geben, wenn eine neue Aktivität darüber kommt oder der Benutzer auf Zurück drückt.quelle
onUserLeaveHint ();
Überschreiben Sie diese Aktivitätsklassenmethode. Dadurch wird das Klicken auf die Home-Taste erkannt. Diese Methode wird direkt vor dem Rückruf von onPause () der Aktivität aufgerufen. Sie wird jedoch nicht aufgerufen, wenn eine Aktivität unterbrochen wird, wie eine Aktivität während eines Anrufs in den Vordergrund tritt. Abgesehen von diesen Unterbrechungen wird sie aufgerufen, wenn der Benutzer auf die Home-Taste klickt.
quelle
Versuchen Sie, für jeden Bildschirm einen Zähler zu erstellen. Wenn der Benutzer HOME berührt, ist der Zähler Null.
quelle
Sie könnten eine Lösung von Andreas Shrade in seinem Beitrag über das Erstellen eines funktionierenden Kiosk-Modus in Android in Betracht ziehen . Es ist ein bisschen hacky, aber angesichts der Gründe, warum das Abfangen der Home-Taste verhindert wird, muss es sein;)
quelle
Ich hatte dieses Problem und da das Überschreiben der onKeyDown () -Methode nichts bewirkt hat, weil das zugrunde liegende Android-System diese Methode nicht aufgerufen hat, habe ich dies mit dem Überschreiben von onBackPressed () gelöst und dort einen booleschen Wert auf false gesetzt , weil ich zurückgedrückt habe, möchte ich Ihnen zeigen, was ich im Code meine:
Der Grund, warum dies funktioniert hat, ist, dass die einzige Möglichkeit, außerhalb dieser Aktivität zu navigieren, darin besteht, zurück oder nach Hause zu drücken. Wenn also zurück gedrückt wurde, weiß ich, dass die Ursache nicht zu Hause war, aber ansonsten war die Ursache zu Hause, daher habe ich den Standard-Booleschen Wert festgelegt Wert für homePressed, um wahr zu sein. Dies funktioniert jedoch nur mit einer einzelnen Aktivitätsinstanz in Ihrer Anwendung, da Sie sonst mehr Möglichkeiten haben, den Aufruf der onPause () -Methode zu veranlassen.
quelle
homePressed
auf "true" gesetzt, und beim Umschalten auf eine andere App würde "Home" gedrückt, wenn dies nicht der Fall war.Seit API 14 können Sie die Funktion verwenden
onTrimMemory()
und nach dem Flag suchenTRIM_MEMORY_UI_HIDDEN
. Dadurch erfahren Sie, dass Ihre Anwendung in den Hintergrund tritt.In Ihrer benutzerdefinierten Anwendungsklasse können Sie also Folgendes schreiben:
Für eine eingehende Untersuchung lade ich Sie ein, diesen Artikel zu lesen: http://www.developerphil.com/no-you-can-not-override-the-home-button-but-you-dont-have -zu/
quelle
Eine Option für Ihre Anwendung wäre das Schreiben eines Ersatz-Startbildschirms mit der Absicht android.intent.category.HOME. Ich glaube, diese Art von Absicht können Sie den Home-Button sehen.
Mehr Details:
http://developer.android.com/guide/topics/intents/intents-filters.html#imatch
quelle
Da Sie nur möchten, dass die Stammaktivität beim Start der App erneut angezeigt wird, können Sie dieses Verhalten möglicherweise durch Ändern der Startmodi usw. im Manifest erreichen.
Haben Sie beispielsweise versucht, das Attribut android: clearTaskOnLaunch = "true" auf Ihre Startaktivität anzuwenden , möglicherweise zusammen mit android: launchMode = "singleInstance" ?
Aufgaben und Back Stack ist eine großartige Ressource für die Feinabstimmung dieser Art von Verhalten.
quelle
Es ist eine schlechte Idee, das Verhalten des Home-Schlüssels zu ändern. Aus diesem Grund können Sie bei Google den Home-Schlüssel nicht überschreiben. Ich würde mich im Allgemeinen nicht mit dem Home-Schlüssel anlegen. Sie müssen dem Benutzer eine Möglichkeit geben, aus Ihrer App herauszukommen, wenn sie aus irgendeinem Grund ins Unkraut gelangt.
Ich würde mir vorstellen, dass jede Umgehung unerwünschte Nebenwirkungen hat.
quelle
Kürzlich habe ich versucht, die Home-Press-Taste zu erkennen, da ich sie genauso ausführen musste wie die Methode " onBackPressed () ". Dazu musste ich die Methode " onSupportNavigateUp () " wie folgt überschreiben :
Es hat perfekt funktioniert. =)
quelle
Jacks Antwort funktioniert perfekt für ein
click
Ereignis, während erlongClick
alsmenu
Knopfdruck betrachtet wird .Übrigens, wenn sich jemand fragt, wie man es über Kotlin macht,
quelle
Android Home Key, der von der Framework-Ebene verwaltet wird, kann auf der Ebene der Anwendungsebene nicht verarbeitet werden. Weil die Home-Button-Aktion bereits in der folgenden Ebene definiert ist. Wenn Sie jedoch Ihr benutzerdefiniertes ROM entwickeln, ist dies möglicherweise möglich. Google hat die Überschreibungsfunktionen der HOME-Taste aus Sicherheitsgründen eingeschränkt.
quelle
Das funktioniert bei mir. Sie können die onUserLeaveHint-Methode https://www.tutorialspoint.com/detect-home-button-press-in-android überschreiben
quelle