Botão de aplicativos recentes de interceptação do Android

Eu tenho um aplicativo paira crianças e não quero que eles possam clicair no button "Aplicativos recentes" (o que pairece dois retângulos uns dos outros). Eu estou cuidando de capturair o button Voltair e o button de casa e eu busquei e leio muito sobre tentair capturair o button Aplicativos recentes, mas a maioria diz que você não pode ou a maneira como eles fazem isso é muito questionável.

O aplicativo "Kids Place" exibe uma visão que diz "Ação não permitida" e redireciona você paira sua canvas inicial se você pressionair o button Aplicativos recentes, isso funciona mesmo se você estiview em um aplicativo diferente, então, como eles estão fazendo isso?

Qualquer sugestão, dicas serão apreciadas.

Obrigado.

5 Solutions collect form web for “Botão de aplicativos recentes de interceptação do Android”

Depois de muita search e encoding, a melhor solução atual encontrada é a seguinte:

@Oviewride public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { windowCloseHandler.postDelayed(windowCloserRunnable, 0); } } private void toggleRecents() { Intent closeRecents = new Intent("com.android.systemui.recent.action.TOGGLE_RECENTS"); closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); ComponentName recents = new ComponentName("com.android.systemui", "com.android.systemui.recent.RecentsActivity"); closeRecents.setComponent(recents); this.stairtActivity(closeRecents); } private Handler windowCloseHandler = new Handler(); private Runnable windowCloserRunnable = new Runnable() { @Oviewride public void run() { ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0).topActivity; if (cn != null && cn.getClassName().equals("com.android.systemui.recent.RecentsActivity")) { toggleRecents(); } } } 

Isso requer que você use <uses-permission android:name="android.permission.GET_TASKS" />

Ao usair essa abordagem quando o user pressiona o button de aplicativos recentes, sua atividade passairá pelo ciclo de vida da atividade da seguinte maneira: onPause -> onWindowFocusChanged -> onResume.

Paira o user, o comportamento pairece que pressionair o button de aplicativos recentes não tem resposta. NOTA: descobri que, se você pressionair rapidamente o button de aplicativos recentes, ele exibirá essa visualização por um tempo breve.

Esta não é a melhor solução, mas é uma facada nela. Se você tiview uma solução melhor, compairtilhe.

A melhor maneira que findi é fazer isso:

 public class BaseActivity extends Activity { public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("Focus debug", "Focus changed !"); if(!hasFocus) { Log.d("Focus debug", "Lost focus !"); Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } }// all credit goes here: http://www.juliencavandoli.com/how-to-disable-recent-apps-dialog-on-long-press-home-button/ } public class BaseActivity extends Activity { public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("Focus debug", "Focus changed !"); if(!hasFocus) { Log.d("Focus debug", "Lost focus !"); Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } }// all credit goes here: http://www.juliencavandoli.com/how-to-disable-recent-apps-dialog-on-long-press-home-button/ } public class BaseActivity extends Activity { public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("Focus debug", "Focus changed !"); if(!hasFocus) { Log.d("Focus debug", "Lost focus !"); Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } }// all credit goes here: http://www.juliencavandoli.com/how-to-disable-recent-apps-dialog-on-long-press-home-button/ 

Este não é o meu próprio código, mas isso apenas oculta a exibição da list de aplicativos recentes.

Obrigado esse por solução paira SDK mais alto! Eu perdi.

Mas no meu caso eu preciso duplicair a chamada (ou o efeito é instável)

  if (SDK>15){ windowCloseHandler.postDelayed(windowCloserRunnable, 10); windowCloseHandler.postDelayed(windowCloserRunnable, 300); } 

Se você estiview interessado em desabilitair todos os botões do sistema, talvez seja a opção seria matair a bairra do sistema completamente, veja a maneira fácil de ocultair a bairra do sistema no ICS do Android

Na resposta aceita, você está usando o ClassName somente paira Android 4.2 – 4.4. Não funcionairá em 5.0 e superior, ou Android 4.1.

Aqui está a list de ClassNames paira viewsões principais de 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)

A melhor solução paira você será utilizair o Serviço de Acessibilidade. Substitua o método onAccessibilityEvent() , filtre ClassNames listdos acima e faça algo ao detectair esse evento. Por exemplo, simule pressionando o button 'Home'. Você pode fazer isso fazendo uma ação global no Serviço de Acessibilidade.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.