it-swarm.com.de

Rufen Sie die Methode auf, wenn die Home-Taste gedrückt wurde

Ich habe diese Methode in einer meiner Android Aktivitäten:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        Log.d("Test", "Back button pressed!");
    }
    else if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        Log.d("Test", "Home button pressed!");
    }
    return super.onKeyDown(keyCode, event);
}

Die Protokollmethode wird jedoch nie ausgelöst, obwohl KEYCODE_HOME gültig ist. Dies funktioniert jedoch für die Schaltfläche "Zurück". Weiß jemand, warum das so ist und wie man das zum Laufen bringt?

52
ingh.am

Die Home-Schaltfläche ist eine sehr gefährliche Schaltfläche zum Überschreiben. Aus diesem Grund können Sie mit Android nicht wie mit der BACK-Schaltfläche das Verhalten der Schaltfläche überschreiben.

Schauen Sie sich das an Diskussion

Sie werden feststellen, dass die Home-Schaltfläche als Absichtsaufruf implementiert zu sein scheint, sodass Sie Ihrer Aktivität am Ende eine Absichtskategorie hinzufügen müssen. Jedes Mal, wenn der Benutzer zu Hause ist, wird Ihre App als Option angezeigt. Sie sollten sich überlegen, was Sie mit der Home-Taste erreichen möchten. Wenn der Standard-Startbildschirm des Geräts nicht ersetzt werden soll, würde ich die HOME-Taste nicht überladen, aber dies ist möglich (siehe Diskussion im obigen Thread).

32
Nick Campion

Ich habe fast einen Monat gebraucht, um das durchzuhalten. Gerade habe ich dieses Problem gelöst. In die onPause () Ihrer Aktivität müssen Sie die folgende if-Bedingung aufnehmen:

    if (this.isFinishing()){
        //Insert your finishing code here
    }

Die Funktion isFinishing () gibt einen Booleschen Wert zurück. True, wenn Ihre App tatsächlich geschlossen wird, False, wenn Ihre App noch ausgeführt wird, der Bildschirm jedoch beispielsweise ausgeschaltet wird.

Ich hoffe es hilft!

22
Raphael

Die HOME-Taste kann nicht von Anwendungen abgefangen werden. Dies ist ein beabsichtigtes Verhalten in Android. Der Grund dafür ist, dass böswillige Apps nicht die Kontrolle über Ihr Telefon erlangen können. Die Home-Schaltfläche gilt als "sichere Zone" des Benutzers und startet immer die vom Benutzer konfigurierte Home-App.

Die einzige Ausnahme ist eine App, die als Ersatz für zu Hause konfiguriert ist. Dies bedeutet, dass in der Datei "AndroidManifest.xml" für die betreffende Aktivität Folgendes deklariert ist:

<intent-filter>
   <action Android:name="Android.intent.action.MAIN" />
   <category Android:name="Android.intent.category.HOME" />
   <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>

Wenn Sie die Home-Taste drücken, wird die onNewIntent-Aktivität der aktuellen Home-App aufgerufen.

12
Lior

Ich habe festgestellt, dass beim Drücken der Taste HOME die Methode onStop () aufgerufen wird. Sie können den folgenden Code verwenden, um ihn zu überwachen:

@Override
    protected void onStop() 
    {
        super.onStop();
        Log.d(tag, "MYonStop is called");
        // insert here your instructions
    }
7
Aderito Brinca

Mit BroadcastReceiver

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // something
    // for home listen
    InnerRecevier innerReceiver = new InnerRecevier();
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    registerReceiver(innerReceiver, intentFilter);

}



// for home listen
class InnerRecevier extends BroadcastReceiver {

    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                    // home is Pressed
                }
            }
        }
    }
}
3
d0ye

KeyEvent.KEYCODE_HOME kann NICHT abgefangen werden.

Es wäre ziemlich schlimm, wenn es möglich wäre.

(Edit): Ich sehe gerade die Antwort von Nicks, die vollkommen vollständig ist;)

3
Oliver

Ich habe eine einfache Lösung für den Umgang mit dem Drücken der Home-Taste. Hier ist mein Code, der nützlich sein kann:

public class LifeCycleActivity extends Activity {


boolean activitySwitchFlag = false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        activitySwitchFlag = true;
        // activity switch stuff..
        return true;
    }
    return false;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override 
public void onPause(){
    super.onPause();
    Log.v("TAG", "onPause" );
    if(activitySwitchFlag)
        Log.v("TAG", "activity switch");
    else
        Log.v("TAG", "home button");
    activitySwitchFlag = false;
}

public void gotoNext(View view){
    activitySwitchFlag = true;
    startActivity(new Intent(LifeCycleActivity.this, NextActivity.class));
}

}

Fügen Sie zusammenfassend einen Booleschen Wert in die Aktivität ein, wenn ein Aktivitätswechsel auftritt (Startaktivitätsereignis), setzen Sie die Variable und überprüfen Sie diese Variable im Ereignis onpause.

2
barisatbas

verwenden Sie die Methode onPause(), um das zu tun, was Sie mit der Home-Taste tun möchten.

2
Jawad Amjad

Ich hatte auch eine Weile Probleme mit der HOME-Taste. Ich wollte einen Hintergrunddienst (der den Standort abfragt) anhalten/überspringen, wenn der Benutzer auf die Schaltfläche HOME klickt.

hier ist, was ich als "Hack-like" -Lösung implementiert habe;

behalten Sie den Status der App in SharedPreferences bei, indem Sie den booleschen Wert verwenden

bei jeder Aktivität

onResume () -> setze appactive = true

onPause () -> setze appactive = false

und der Hintergrunddienst prüft den AppState in jeder Schleife, überspringt die Aktion

IF appactive = false

es funktioniert gut für mich, zumindest nicht mehr die Batterie entleeren, hoffe, das hilft ....

1
guleryuz