21

Mi chiedo quale metodo venga chiamato da questo pulsante.Come rilevare i clic del pulsante di sistema "Applicazioni recenti" (Honeycomb +)

enter image description here

Il mio gioco si ferma sempre/riprende correttamente tranne quando uso questo pulsante, la sua sembra che questo tasto non chiama i onPause() e onResume() metodi di un Activity. Funziona se esco dal gioco, andare in un'altra finestra (come quella sulla foto) e quindi utilizzare questo pulsante per riprendere. Ma se premo semplicemente questo pulsante, durante l'ingame, il gioco si ferma ma il contenuto del file non riprende come fa ogni altra volta, il tipo di gioco rimane immobile sullo schermo e lampeggia leggermente.

Difficile da spiegare ma spero di essere in qualche modo chiaro, in caso contrario, chiedere!

+1

Questo non ha nulla a che fare con l'implementazione del pulsante. Questo è un difetto nel gioco la sua implementazione. – DroidBender

+0

Ma funziona come dovrebbe quando esco dal gioco attraverso il pulsante "home" e poi lo inserisco nuovamente attraverso questo "windows-open" -button'. L'unica volta che funziona non è quando premo il tasto "windows-open" -button durante la partita, quindi premo subito la finestra per il gioco. Quindi deve essere una sorta di differenza nel modo in cui 'onPause()' e 'onResume()' viene chiamato qui rispetto a come vengono normalmente chiamati. –

risposta

21

Nessuno dei metodi standard Activity Lifecycle viene chiamato quando si preme il pulsante "Applicazioni recenti". L'attività rimarrà attiva dopo l'elenco dei popup delle app recenti. Attraverso la parte sinistra semitrasparente di questa lista puoi persino osservare che l'animazione dell'applicazione è ancora in esecuzione, se stai eseguendo un gioco con qualche animazione che non ha gestito correttamente questa situazione. In realtà molti dei giochi di Google Play non hanno gestito correttamente questa situazione, anche quelli buoni, come Angry Birds.

L'unico metodo di attività viene chiamato quando l'utente apre l'elenco "App recenti" (o restituisce da esso) è onWindowFocusChanged con il parametro booleano hasFocus. Quando l'utente apre l'elenco del metodo App recente onWindowFocusChanged() chiamato con hasFocus uguale a false e lo stesso metodo chiamato con hasFocus equivale a true quando l'utente preme Indietro in questo elenco.

+0

grazie, chiarito un po ':) sempre bello sapere la macchina con cui stai lavorando. –

+1

Sembra che su Android 4.4.4, onPause/onStop vengano chiamati quando viene premuto il pulsante delle app recenti. – amram99

+1

Ma onWindowFocusChanged sarà anche falso se apri un'altra attività all'interno dell'app, quindi non è necessariamente d'aiuto sapere che è stato premuto il pulsante "App recenti" (chiamato anche il pulsante Panoramica ora). – Bourne

0

È questo solo il problema con questo gioco specifico? O è con ogni gioco che giochi?

Oltre allo onPause() e onResume(), esiste un altro ciclo chiamato onStop(). Forse ci sono alcune cose fondamentali che vengono fatte qui. Con la pressione di quel pulsante "windows-open", il gioco probabilmente non andrà a onStop -state mentre premendo il pulsante "home" lo farà.

+0

buon punto, proverò a taggare alcuni metodi e vedere cosa succede. –

0

provare questo:

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    Log.d("Focus debug", "Focus changed !"); 

    if (!hasFocus) { 
     Log.d("Focus debug", "Lost focus !"); 

    } 
} 
3

ho dovuto affrontare problemi simili, così, ho bisogno di sapere quando l'utente premere il pulsante recente app (tasto chiave del menu nelle vecchie versioni di Android). dopo diverse ore di ricerca, non ho trovato un evento da catturare quando si preme il pulsante home o il pulsante menu. ho scoperto che si tratta di prendere un tempo più lungo per chiamare onStop() quando l'utente premere il tasto home, quindi immagino che un trucco per distinguere tra questi pulsanti di rimorchio relativi sul tempo di risposta e imperativi due metodi:

@Override

public void onUserLeaveHint() { 
    // do stuff 
    super.onUserLeaveHint(); 
    userLeaveTime = System.currentTimeMillis() ; 
    isNotPower = true; 
} 

@Override

public void onStop() { 
    super.onStop(); 
    if (isNotPower) { 
     defStop = System.currentTimeMillis() - userLeaveTime; 
     if (defStop > 200) { 
      //home button 
     } 
     if (defStop < 200) { 
      //recent apps button 
     } 
    } 
    isNotPower = false; 
} 
  • parametro isNotPower che è di verificare che non il pulsante di accensione è pressed- quando il pulsante di accensione premuto l'onStop() viene chiamato ma non th o nUserLeaveHint().
2

Per rilevare quando è stato premuto il pulsante "Applicazioni recenti" è possibile utilizzare il Servizio di accessibilità.Dovrai eseguire il tuo servizio di accessibilità e ricevere eventi con tipo "TYPE_WINDOW_STATE_CHANGED" e controllare il nome della classe dell'evento.

  1. Leggi su Accessibility Service nello sviluppatore Android. Configura il tuo servizio di accessibilità, chiedi il permesso all'utente.
  2. Nella tua Accessibilità Servizio metodo di sostituzione onAccessibilityEvent()
  3. In questo metodo si riceverà AccessibilityEvent event oggetto, questo oggetto contiene tutte le informazioni necessarie su un evento che si sono appena accaduto sul dispositivo.
  4. Siamo interessati a ClassName. ClassName a volte può essere nullo quindi non dimenticare di! = Null check. nomi dei package di applicazioni recenti finestra varia a seconda della versione di Android:

    • Android 4.1: "com.android.internal.policy.impl.RecentApplicationsDialog"
    • Android 4,2-4,4: "com.android .systemui.recent.RecentsActivity"
    • Android 5,0-7,1: "com.android.systemui.recents.RecentsActivity"("" lettera s è stato aggiunto)

non so il nome della classe per i dispositivi più vecchi ma non credo che qualcuno li mantiene nel 2017;)

in modo da avere qualcosa di simile:

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || event.getClassName() == null) 
     return; 

    String className = String.valueOf(event.getClassName()); 

    if (className.equals("com.android.internal.policy.impl.RecentApplicationsDialog") 
      || className.equals("com.android.systemui.recent.RecentsActivity") 
      || className.equals("com.android.systemui.recents.RecentsActivity")){ 
     //Recent button was pressed. Do something. 
    } 
} 

ho testato sui seguenti dispositivi reali: LG, Nexus, Sony e virtuale dispositivi: Motorola, Samsung.

Se qualcuno conosce un'eccezione per questi nomi di classe, per favore mandami un messaggio.

1

Il modo migliore che ho trovato è listent a Broadcast azione chiamato "ACTION_CLOSE_SYSTEM_DIALOGS" .Da la documentazione di Google:

Azione Broadcast: Questa è la trasmissione quando un'azione utente deve richiedere una finestra sistema temporaneo per chiudere. Alcuni esempi di finestre di dialogo del sistema temporaneo sono le finestre di notifica e la finestra di dialogo delle attività recenti .

codice di lavoro:

IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
        //do what you want here 
      } 
     } 
    }; 
    this.registerReceiver(broadcastReceiver, intentFilterACSD); 
1

Ho lo stesso problema, ho risolto questo problema come below.er

pulsante Register click trasmissione per la casa e RecentApp

InnerReceiver mReceiver = new InnerReceiver(); 
IntentFilter mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
registerReceiver(mReceiver, mFilter); 

Ora BroadcastReceiver code

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

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
      String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
      if (reason != null) { 
       if (mListener != null) { 
        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
         // Home Button click 
        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
         // RecentApp or Overview Button click 
        } 
       } 
      } 
     } 
    } 
} 

Ma non ha dimenticato di unregisterReceiver BroadcastReceiver

+1

Ho eseguito l'implementazione completa qui in Android per la risposta nativa https://github.com/evanjmg/react-native-home-pressed/blob/master/android/src/main/java/com/evanjmg/HomeWatcher. Giava – evanjmg

Problemi correlati