Rileva la pressione del button Home in android

Questo mi ha guidato per qualche istante.

C'è un modo per rilevare in modo affidabile se il button Home è stato premuto in un'applicazione android?

  • È ansible avere autorizzazioni "opzionali" in Android?
  • Asus Nexus 7 non riconosciuto dagli strumenti di dev Android tramite adb
  • Applicazione client RTP su dispositivo Android Android
  • Come filtrare solo URL specifico con filter intento
  • OPENGL ES non funziona: no Context attuale
  • Problema di Android: Debug quando il telefono è spento
  • In caso contrario, esiste un modo robusto di spiegare cosa ha causato un'attività ad accedere aPause? cioè possiamo rilevare se è stato causato da una nuova attività lanciando o premendo indietro / home.

    Un suggerimento che ho visto è quello di ignorare onPause () e call isFinishing (), ma questo restituirà false quando si preme il button Home proprio come avrebbe fatto se una nuova attività sta iniziando in modo che non riesca a distinguere tra i due.

    Qualsiasi aiuto è molto apprezzato.

    ** Aggiorna **: Grazie a @ android-affamati per questo link: http://nisha113a5.blogspot.com/

    Sovrascrivere il seguente metodo:

    @Override public void onAttachedToWindow() { super.onAttachedToWindow(); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } 

    Quindi il seguente evento verrà licenziato per le presse a button:

     @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); 

    Non sono sicuro se ci sono effetti collaterali con questa linea:

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

    Sembra quindi che, contrariamente alla credenza popolare, si può effettivamente ascoltare la chiave di casa. Preoccupante, puoi tornare falso e avere la chiave di casa non fare nulla.

    Aggiornamento : Come previsto, ci sono alcuni effetti collaterali con questo – sembra che i video incorporati e le mappe google non siano visibili con questa modalità abilitata.

    Aggiornamento : Probabilmente questo hack non funziona più da Android 4.0 in poi

  • La vista Wrap_content all'interno di un ConstraintLayout si estende al di fuori dello schermo
  • Android Imageswitcher: scatti periodicamente le immagini?
  • come mettere il text sotto la visualizzazione di immagini
  • Come personalizzare l'elenco con baseadapter
  • Come gestire il pagination in retrofit
  • Come abilitare l'accesso di Google Play App
  • 12 Solutions collect form web for “Rileva la pressione del button Home in android”

    Il seguente codice funziona per me 🙂

     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 InnerRecevier mRecevier; public HomeWatcher(Context context) { mContext = context; mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); } public void setOnHomePressedListener(OnHomePressedListener listener) { mListener = listener; mRecevier = new InnerRecevier(); } public void startWatch() { if (mRecevier != null) { mContext.registerReceiver(mRecevier, mFilter); } } public void stopWatch() { if (mRecevier != null) { mContext.unregisterReceiver(mRecevier); } } class InnerRecevier 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(); } 

    Questa è una vecchia domanda ma potrebbe aiutare qualcuno.

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

    Secondo la documentazione, il metodo onUserLeaveHint () viene chiamato quando l'utente fa clic sul button Home o quando qualcosa interrompe l'applicazione (ad esempio una chiamata in arrivo).

    Questo funziona per me .. 🙂

    È imansible rilevare e / o intercettare il button HOME da un'applicazione Android. Questo è incorporato nel sistema per evitare applicazioni dannose che non possono essere uscite.

    Ho bisogno di avviare / interrompere la musica di sottofondo nella mia applicazione quando la prima attività si apre e chiude o quando un'attività viene interrotta dal button Home e quindi ripresa dal task manager. La riproduzione pura di rest / ripresa in Activity.onPause() e Activity.onResume() interrotto la musica per un po ', quindi ho dovuto scrivere il seguente codice:

     @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 } } 

    che interrompe la riproduzione solo quando l'applicazione (tutte le sue attività) è chiusa o quando viene premuto il button Home. Sfortunatamente non ho riuscito a cambiare l'ordine di chiamate di onPause() metodo dell'attività di avvio e di onResume() dell'attività iniziata quando Activity.startActivity() viene chiamato (o rilevare in onPause() che l'attività sta lanciando un'altra attività altra modo) per cui questo caso deve essere trattato in modo speciale:

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

    Un altro inconveniente è che questo richiede GET_TASKS authorization GET_TASKS aggiunta a AndroidManifest.xml :

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

    La modifica di questo codice che reagisce solo sul button Home button è straordinaria.

    Sostituire onUserLeaveHint() nell'attività. Non ci sarà mai alcun richiamo all'attività quando una nuova attività viene sopra esso o l'utente premere indietro premere.

    Provare a creare un contatore per each schermata. Se l'utente tocca HOME, il contatore sarà zero.

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

    Potresti considerare una soluzione di Andreas Shrade nel suo post su Come creare una modalità di chiosco di lavoro in Android . È un po 'aggraziato, ma dato le ragioni che impediscono l'intercettazione del button Home, deve essere;)

    Ho avuto questo problema e, poiché l'overriding del metodo onKeyDown () non ha compiuto nulla a causa del sottostante sistema android non ha chiamato questo metodo, ho risolto questo con overriding onBackPressed () e ho avuto un valore boolean impostato su false , perché ho premuto indietro, lasciathemes mostrare ciò che intendo in codice:

     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"); } } 

    Quindi il motivo per cui questo ha funzionato è perché l'unico modo per navigare fuori di questa attività è premendo indietro o casa, quindi se indietro è stato premuto quindi so che la causa non era a casa, ma altrimenti la causa era a casa, quindi ho impostato il boolean di default valore per homePressed per essere vero. Tuttavia questo funziona solo con un'istanza di attività singola nell'applicazione, in quanto altrimenti hai più possibilità di call il metodo onPause ().

    Un'opzione per l'applicazione è quella di scrivere una Schermata iniziale di sostituzione utilizzando l'intento android.intent.category.HOME. Credo che questo tipo di intenti potete vedere il button Home.

    Più dettagli:

    http://developer.android.com/guide/topics/intents/intents-filters.html#imatch

    L'applicazione media può andare bene senza wherer conoscere la differenza tra una printing a casa e un evento di pausa. In altre parole, onPause () è di solito sufficiente.

    Perché vuoi fare questo? Dareci maggiori informazioni sulle vostre intenzioni potrebbe portre a una migliore strategia complessiva per te.

    Poiché si desidera solo che l'attività principale venga rilevata all'avvio dell'applicazione, è ansible get questo comportmento modificando le modalità di avvio, ecc. Nel manifesto?

    Per esempio, hai provato ad applicare l' android: clearTaskOnLaunch = "true" all'attività di lancio, forse in combinazione con android: launchMode = "singleInstance" ?

    Attività e Back Stack è una grande risorsa per ottimizzare questo tipo di comportmento.

    È una brutta idea per cambiare il comportmento della chiave di casa. Ecco perché Google non ti consente di ignorare la chiave di casa. Non avrei mai messo con la chiave di casa in generale. Devi dare all'utente un modo per uscire dalla tua app se scende nelle erbacce per qualunque motivo.

    Avrei image qualsiasi lavoro intorno avrà effetti collaterali indesiderati.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.