Frage Erkennen Sie die Home-Taste drücken Sie in Android


Das macht mich jetzt schon eine Weile verrückt.

Gibt es eine Möglichkeit, zuverlässig zu erkennen, ob die Home-Taste in einer Android-Anwendung gedrückt wurde?

Gelingt das nicht, gibt es eine robuste Möglichkeit zu sagen, was eine Aktivität in onPause ausgelöst hat? Können wir feststellen, ob es durch das Starten einer neuen Aktivität oder durch Drücken von back / home verursacht wurde?

Ein Vorschlag, den ich gesehen habe, besteht darin, onPause () zu überschreiben und isFinishing () aufzurufen, aber dies wird false zurückgeben, wenn die Home-Taste gedrückt wird, genauso wie es beim Start einer neuen Aktivität der Fall wäre.

Jede Hilfe wird sehr geschätzt.

** Aktualisierung **: Danke an @ android-hungrig für diesen Link: http://nisha113a5.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 mir nicht sicher, ob es irgendwelche Nebenwirkungen mit dieser Linie gibt:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

Es scheint also so zu sein, dass man entgegen der landläufigen Meinung tatsächlich auf den Home Key hören kann. Beunruhigenderweise können Sie falsch zurückgeben und den Home-Schlüssel nicht tun.

Aktualisieren: Wie erwartet, gibt es einige Seiteneffekte mit diesem - es scheint, dass eingebettete Videos und Google Maps mit diesem Modus nicht sichtbar sind.

Aktualisieren: Angeblich funktioniert dieser Hack nicht mehr ab Android 4.0


75
2018-01-16 15:12


Ursprung


Antworten:


Der folgende Code funktioniert für mich :)

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerReceiver mReceiver;

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mReceiver = new InnerReceiver();
    }

    public void startWatch() {
        if (mRecevier != null) {
            mContext.registerReceiver(mReceiver, mFilter);
        }
    }

    public void stopWatch() {
        if (mRecevier != null) {
            mContext.unregisterReceiver(mReceiver);
        }
    }

    class InnerReceiver extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            mListener.onHomePressed();
                        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}
public interface OnHomePressedListener {
    public void onHomePressed();

    public void onHomeLongPressed();
}

99
2018-01-15 03:16



Das ist eine alte Frage, aber es könnte jemandem helfen.

@Override
protected void onUserLeaveHint()
{
    Log.d("onUserLeaveHint","Home button pressed");
    super.onUserLeaveHint();
}

Laut 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 für mich .. :)


41
2017-07-07 14:28



Es ist nicht möglich, die HOME-Taste in einer Android-App zu erkennen und / oder abzufangen. Dies ist in das System integriert, um schädliche Anwendungen zu verhindern, die nicht beendet werden können.


10
2018-01-16 15:20



Ich musste die Hintergrundmusik in meiner Anwendung starten / beenden, wenn die erste Aktivität geöffnet und geschlossen wird oder wenn eine Aktivität durch die Home-Schaltfläche angehalten und dann vom Task-Manager wieder aufgenommen wird. Reine Wiedergabe stoppt / setzt in Activity.onPause() und Activity.onResume() unterbrach die Musik für eine Weile, also musste ich den folgenden Code schreiben:

@Override
public void onResume() {
  super.onResume();

  // start playback here (if not playing already)
}

@Override
public void onPause() {
  super.onPause();

  ActivityManager manager = (ActivityManager) this.getSystemService(Activity.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(Integer.MAX_VALUE);
  boolean is_finishing = this.isFinishing();
  boolean is_last = false;
  boolean is_topmost = false;
  for (ActivityManager.RunningTaskInfo task : tasks) {
    if (task.topActivity.getPackageName().startsWith("cz.matelier.skolasmyku")) {
      is_last = task.numRunning == 1;
      is_topmost = task.topActivity.equals(this.getComponentName());
      break;
    }
  }

  if ((is_finishing && is_last) || (!is_finishing && is_topmost && !mIsStarting)) {
    mIsStarting = false;
    // stop playback here
  }
}

die die Wiedergabe nur unterbricht, wenn die Anwendung (alle ihre Aktivitäten) geschlossen ist oder wenn die Home-Taste gedrückt wird. Leider habe ich nicht geschafft, Reihenfolge von Anrufen von zu ändern onPause() Methode der Startaktivität und onResume() von der gestarteten Aktivität wann Activity.startActivity() heißt (oder erkennen in onPause() Diese Aktivität startet eine andere Aktivität auf andere Weise. Daher muss dieser Fall speziell behandelt werden:

private boolean mIsStarting;

@Override
public void startActivity(Intent intent) {
  mIsStarting = true;
  super.startActivity(intent);
}

Ein weiterer Nachteil ist, dass dies erfordert GET_TASKS Berechtigung hinzugefügt zu AndroidManifest.xml:

<uses-permission
  android:name="android.permission.GET_TASKS"/>

Die Änderung dieses Codes, der nur beim Drücken der Home-Taste reagiert, ist geradlinig.


7
2018-03-14 19:57



Überschreiben onUserLeaveHint() in der Aktivität. Es wird nie einen Rückruf zu der Aktivität geben, wenn eine neue Aktivität darüber stattfindet oder der Benutzer die Taste drückt.


4
2018-04-21 11:41



Versuchen Sie, für jeden Bildschirm einen Zähler zu erstellen. Wenn der Benutzer HOME berührt, ist der Zähler Null.

public void onStart() {
  super.onStart();
  counter++;
}

public void onStop() {
  super.onStop();
  counter--;    
  if (counter == 0) {
      // Do..
  }
}

2
2017-08-14 18:04



Sie könnten eine Lösung von Andreas Shrade in seinem Beitrag an überlegen So erstellen Sie einen funktionierenden Kiosk-Modus in Android. Es ist ein bisschen hacky, aber angesichts der Gründe, dass das Abhören der Home-Taste verhindert wird, muss es sein;)


2
2017-07-28 14:15



Ich hatte dieses Problem, und da das Überschreiben der onKeyDown () -Methode nichts brachte, weil das zugrundeliegende Android-System diese Methode nicht aufgerufen hat, löste ich dies mit dem Überschreiben onBackPressed (), und ich hatte dort einen booleschen Wert auf false gesetzt , weil ich zurückgedrückt habe, lass mich dir zeigen, was ich im Code meine:

import android.util.Log;
public class HomeButtonActivity extends Activity {
    boolean homePressed = false;
    // override onCreate() here.

    @Override
    public void onBackPressed() {
        homePressed = false; // simply set homePressed to false
    }

    @Overide
    public void onResume() {
        super.onResume();
        homePressed = true; // default: other wise onBackPressed will set it to false
    }

    @Override
    public void onPause() {
        super.onPause();
        if(homePressed) { Log.i("homePressed", "yay"); }
    }

Der Grund, warum dies funktionierte, ist, weil die einzige Möglichkeit, außerhalb dieser Aktivität zu navigieren, durch Drücken von back oder home ist. Wenn zurück gedrückt wurde, weiß ich, dass die Ursache nicht zuhause war, aber ansonsten war die Ursache zuhause, deshalb setze ich den Standard-Boolean 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, die onPause () -Methode aufzurufen.


2
2017-07-30 22:49



onUserLeaveHint ();

überschreiben Sie diese Aktivitätsklassenmethode. Dadurch wird der Home-Key-Klick erkannt. Diese Methode wird direkt vor dem Aufruf von onPause () der Aktivität aufgerufen. Sie wird jedoch nicht aufgerufen, wenn eine Aktivität unterbrochen wird, wenn eine aktive Aktivität in den Vordergrund tritt. Abgesehen von diesen Unterbrechungen wird sie aufgerufen, wenn der Benutzer auf die Home-Taste klickt.

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    Log.d(TAG, "home key clicked");
}

1
2017-10-06 14:18