2013-07-21 20 views
10

Mam aplikację przeznaczoną dla dzieci i nie chcę, aby można było kliknąć przycisk "Ostatnie aplikacje" (ten, który wygląda jak dwa prostokąty nad sobą). Zajmuję się przechwytywaniem przycisku wstecz i przycisku strony głównej, a ja dużo wyszukiwałem i czytałem o próbie przechwycenia przycisku Ostatnie aplikacje, ale większość twierdzi, że nie możesz lub sposób, w jaki to robią, jest bardzo wątpliwy.Przycisk przechwytywania android przycisk ostatnich aplikacji

Aplikacja "Miejsce dla dzieci" wyświetla widok "Nie można wykonać czynności" i przekierowuje Cię do ekranu głównego, jeśli naciśniesz przycisk Ostatnie aplikacje, działa to nawet w przypadku innej aplikacji, więc w jaki sposób oni to robią?

Wszelkie sugestie, wskazówki będą mile widziane.

Dzięki.

+0

Tak, mam ekran główny i zajmuję się tym z filtrem intencyjnym. Moje pytanie dotyczy przycisku "Ostatnie aplikacje". – esse

+0

Wiem, że to nie jest odpowiedź, ale jeśli wszystko inne zawiedzie, możesz spróbować dekompilować tę aplikację i zobaczyć, jak to robią. – Shmuel

+0

Powiązane: http://stackoverflow.com/questions/14574239/how-to-disable-the- recent-tasks-apps-button-in-android? rq = 1 – talkol

Odpowiedz

20

Po wielu poszukiwaniach i kodowania aktualny najlepsze rozwiązanie znalazłem to:

@Override 
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.startActivity(closeRecents); 
} 

private Handler windowCloseHandler = new Handler(); 
private Runnable windowCloserRunnable = new Runnable() { 
    @Override 
    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(); 
     } 
    } 
} 

ta wymaga użycia <uses-permission android:name="android.permission.GET_TASKS" />

Przy zastosowaniu tej metody, gdy użytkownik naciśnie przycisk Ostatnie aplikacje to spowoduje, że twoja aktywność przejdzie przez cykl życia aktywności w następujący sposób: onPause -> onWindowFocusChanged -> onResume.

Dla użytkownika pojawia się zachowanie, że naciśnięcie przycisku ostatnich aplikacji nie odpowiada. UWAGA: Zauważyłem, że jeśli szybko naciśniesz przycisk ostatnich aplikacji, widok ten będzie wyświetlany przez krótki czas.

To nie jest najlepsze rozwiązanie, ale jest to ukłucie. Jeśli masz lepsze rozwiązanie, udostępnij je.

+0

Tricky, ale robi to, co obiecuje :) miła robota! –

+0

to działa na Lollipop –

+0

"com.android.systemui.recent.RecentsActivity" jest tylko dla Androida 4.2 - 4.4. Zobacz moją odpowiedź na ClassNames dla innych wersji Androida. –

0

dziękuje esse za rozwiązanie dla wyższej wersji SDK! Brakowało mi tego.

Ale w moim przypadku muszę powielić połączenie (lub skutkiem jest niestabilny)

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

Musiałem to powtórzyć i napotkałem niestabilny problem, dziękuję za twój post. – esse

3

Najlepszym sposobem znalazłem to, aby to zrobić:

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/ 

To nie jest mój własny kod , ale to tylko ukrywa listę ostatnich aplikacji.

+0

Wypróbowałem to i nie działa ono dla mnie, SDK> = 14 na Nexusie 7. – esse

+2

Do wykorzystania w przyszłości: wierzę, że działa to tylko na urządzeniach Samsung. – Randy

+0

To działa dla mnie yeahhh !!! – androidBoomer

0

w przyjętym odpowiedź używasz ClassName tylko dla Androida 4.2 - 4.4. Nie będzie działać w wersji 5.0 lub nowszej ani w systemie Android 4.1.

Oto lista classnames dla głównych wersji Androida:

  • 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" list został dodany)

najlepszym rozwiązaniem dla Ciebie będzie wykorzystywać Accessibility Servi ce. Zastąp metodę onAccessibilityEvent(), odfiltruj wyżej wymienione nazwy i coś zrób, gdy wykryjesz to zdarzenie. Na przykład symuluj naciśnięcie przycisku "Strona główna". Możesz to zrobić, wykonując globalną akcję w usłudze dostępności.

Powiązane problemy