Como detectair "Clique no button do sistema" Aplicativos recentes (Honeycomb +)

Estou me perguntando qual método este button chama.

insira a descrição da imagem aqui

  • Como faço paira editair um Android EditView 'Done' button e ocultair o keyboard quando clicado?
  • CollapsingToolbairLayout setTitle () não atualiza a less que colapsado
  • Escrevendo o código Android compatível com viewsões anteriores
  • Android: atualize itens ListView a cada 1 minuto
  • O ícone da notificação FCM não está sendo usado
  • No MVP está onClick responsabilidade de View or Presenter?
  • O meu jogo sempre faz uma pausa / recomeça corretamente, exceto quando eu uso esse button, pairece que esse button não chama os onPause() e onResume() de uma atividade . Funciona se eu sair do jogo, vá paira outra window (como a da image) e depois use este button paira continuair. Mas se eu apenas pressionair este button, quando ingame, o jogo pára, mas o thread não é retomado como faz a cada outro momento, o tipo de jogo simplesmente fica pairado na canvas e vibra um pouco.

    Difícil de explicair, mas espero que esteja sendo clairo, se não, pergunte!

  • O que é uma biblioteca de suporte do Android?
  • Excluir vairiantes de compilation específicas
  • android assetManager
  • Alterair o valor da checkbox de viewificação sem ativair onCheckChanged
  • Exibir uma sobreposition de cairga na canvas do Android
  • Desenvolvimento móvel - Native VS Cross Platform VS JavaScript
  • 6 Solutions collect form web for “Como detectair "Clique no button do sistema" Aplicativos recentes (Honeycomb +)”

    Nenhum dos methods padrão do ciclo de vida da atividade é chamado quando o button "Aplicativos recentes" é pressionado. Atividade permanecerá ativa após a list de popups de aplicativos recentes. Através da pairte esquerda semi-transpairente desta list, você pode até observair a animação de aplicativos ainda está sendo executada, se você estiview executando um jogo com alguma animação que não manipulasse essa situação corretamente. Na viewdade, muitos dos jogos do Google Play não lidairam com esta situação, mesmo com os bons, como Angry Birds.

    O único método de atividade é chamado quando o user abre a list de "Aplicativos recentes" (ou retorna dele) é onWindowFocusChanged com o pairâmetro boolean hasFocus . Quando o user abrir a list de método de Aplicação Recente onWindowFocusChanged() chamado com hasFocus é igual a false , e o mesmo método chamado com hasFocus é igual a true quando o user pressiona Voltair nesta list.

    Eu enfrentei um problema semelhante, então, eu precisava saber quando o user pressiona o button de aplicativos recentes (button de tecla do menu em viewsões antigas do android). Após várias horas de search, não findi um evento paira pegair quando o button inicial ou o button de menu são pressionados. Eu achei que é preciso mais tempo paira ligair paira o OnStop () quando o user pressiona o button inicial, então eu acho um truque paira distinguir entre esses botões de reboque relacionados com o tempo de resposta e substituindo dois methods:

    @Sobrepor

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

    @Sobrepor

     public void onStop() { super.onStop(); if (isNotPower) { defStop = System.currentTimeMillis() - userLeaveTime; if (defStop > 200 ) { //home button } if (defStop < 200) { //recent apps button } } isNotPower = false; } } public void onStop() { super.onStop(); if (isNotPower) { defStop = System.currentTimeMillis() - userLeaveTime; if (defStop > 200 ) { //home button } if (defStop < 200) { //recent apps button } } isNotPower = false; } } public void onStop() { super.onStop(); if (isNotPower) { defStop = System.currentTimeMillis() - userLeaveTime; if (defStop > 200 ) { //home button } if (defStop < 200) { //recent apps button } } isNotPower = false; } } public void onStop() { super.onStop(); if (isNotPower) { defStop = System.currentTimeMillis() - userLeaveTime; if (defStop > 200 ) { //home button } if (defStop < 200) { //recent apps button } } isNotPower = false; } 
    • O pairâmetro isNotPower é paira viewificair se o button de energia não é pressionado – quando o button liga / desliga pressiona o método onStop () é chamado, mas não o onUserLeaveHint ().

    Este é apenas o problema com este jogo específico? Ou é com cada jogo que você joga?

    Ao lado do onPause() e onResume() , existe outro ciclo chamado onStop() . Talvez haja algumas coisas fundamentais que estão sendo feitas aqui. Com a pressão desse button "windows-open", o jogo provavelmente não entrairá em onStop enquanto pressionando o button "home", será.

    tente este:

     public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("Focus debug", "Focus changed !"); if (!hasFocus) { Log.d("Focus debug", "Lost focus !"); } } } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("Focus debug", "Focus changed !"); if (!hasFocus) { Log.d("Focus debug", "Lost focus !"); } } 

    Paira detectair quando o button "Aplicativos recentes" foi pressionado, você pode usair o Serviço de Acessibilidade. Você precisairá executair seu próprio Serviço de Acessibilidade e receber events com o tipo "TYPE_WINDOW_STATE_CHANGED" e viewificair o nome da class do evento.

    1. Leia sobre o Serviço de Acessibilidade no desenvolvedor Android. Configure seu próprio Serviço de Acessibilidade, solicite permissão do user.
    2. No seu método de substituição do service de acessibilidade onAccessibilityEvent()
    3. Neste método, você receberá o object de AccessibilityEvent event , este object contém todas as informações necessárias sobre um evento que acabou de acontecer no seu dispositivo.
    4. Estamos interessados ​​no ClassName. O ClassName às vezes pode ser nulo, então não se esqueça! = Verificação nula. Os nomes dos packages de aplicativos recentes vairiam dependendo da viewsão do 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" ("s" foi adicionada)

    Não conhece o nome da class paira dispositivos mais antigos, mas não acho que alguém os mantenha em 2017;)

    Então você terá algo como isto:

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

    Testei-o nos seguintes dispositivos reais: LG, Nexus, Sony e dispositivos virtuais: Motorola, Samsung.

    Se alguém conhece uma exception paira esses nomes de class, por favor, me faça ping.

    A melhor maneira que findi é listr a ação de difusão chamada "ACTION_CLOSE_SYSTEM_DIALOGS". Dos documentos do Google:

    Ação de difusão: isso é transmitido quando uma ação do user deve solicitair uma checkbox de dialog temporária do sistema paira descairtair. Alguns exemplos de dialogs temporários do sistema são a window de notificação e a checkbox de dialog de tairefas recentes .

    Código de trabalho:

     IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //do what you want here } } }; this.registerReceiview(broadcastReceiview, intentFilterACSD); public void onReceive (Context context, intenção intenção) { IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //do what you want here } } }; this.registerReceiview(broadcastReceiview, intentFilterACSD); } IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //do what you want here } } }; this.registerReceiview(broadcastReceiview, intentFilterACSD); } IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //do what you want here } } }; this.registerReceiview(broadcastReceiview, intentFilterACSD); }; IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //do what you want here } } }; this.registerReceiview(broadcastReceiview, intentFilterACSD); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.