Blocca / disabilita il button delle applicazioni recenti

So che questa domanda è stata chiusa prima di Android Distriggers il Task di recente attività come in SureLock , ma dato che la risposta non funziona, forse qualcuno può condividere una luce su questo mater dimenticato.

Ho anche provato:

  • SQLite ha restituito un codice di errore di 14
  • Spostamento di un'image utilizzando l'accelerometro di android
  • Android - Composti generati dynamicmente dal cliente Visualizzazione ricreata in RecyclerView, causando scarse performance
  • Aggiunta di PreferenceFragment a FragmentPagerAdapter
  • Torcia della camera Samsung Galaxy S5 non funziona
  • Login di Facebook e al server web
  • private void closeRecents() { activ.sendBroadcast(new Intent("com.android.systemui.recent.action.CLOSE")); 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(SYSTEM_UI_PACKAGE_NAME, RECENTS_ACTIVITY); closeRecents.setComponent(recents); activ.startActivity(closeRecents); } 

    ma senza fortuna

  • Metodi WebView sullo stesso thread errore
  • Schedulers.io () non tornando al thread principale
  • Errore compreso Android-DirectionalViewPager .jar in Eclipse
  • Come fare la scivolata come picasso?
  • Cambia colore di dialogo DataPicker per Android 5.0
  • Codifica dei messaggi SMS in Android
  • 7 Solutions collect form web for “Blocca / disabilita il button delle applicazioni recenti”

    Fare questo non è affatto difficile. L'ho implementato in una delle mie applicazioni e funziona perfettamente.

    Passo 1

    Aggiungere questa authorization al file manifest.xml

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

    Passo 2

    Inserisci questo codice in Activity in cui vuoi bloccare / disabilitare il button app recente

      @Override protected void onPause() { super.onPause(); ActivityManager activityManager = (ActivityManager) getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); activityManager.moveTaskToFront(getTaskId(), 0); } 

    Ho provato in diversi dispositivi e sta funzionando perfettamente. Premendo il button apps recenti, la schermata sarà nero per less di un secondo ma riprenderà la tua attività.

    Questa risposta mi ha aiutato . Non è il migliore perché alcuni methods sono ormai obsoleti. Funziona per me (4.4.2), per ora, ma anch'io vorrei trovare una soluzione più ideale.

      @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { windowCloseHandler.postDelayed(windowCloserRunnable, 250); } } 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(); } } }; 

    Con questa authorization:

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

    @Tazz Non puoi solo. Imansible.

    Sì, è frustrante, OS sono a volte. Ho spesso incontrato problemi come questo per aver bisogno di disegni avanzati, qui hai colpito un muro. Il sistema operativo non fornisce la funzionalità, è fuori dal potere dello sviluppatore. È annying ma vero, non puoi. Anche una bontà non trasformsrà SDK in Magic.

    Alla fine E se la tua applicazione è dedicata ai dispositivi inhouse – non pubblicazioni – puoi cambiare codice in SDK di Android – è opensource. Se intendi pubblicare sul negozio Play, è semplicemente inutile.

    Un trucco facile che ha funzionato per me (in una Samsung Galaxy S6) è di lanciare nuovamente l'attività quando viene chiamato onStop (), perché la tua attività chiamerà onStop () quando l'utente fa clic sul button delle applicazioni recenti.

     @Override public void onStop() { startActivity(new Intent(context, YourActivity.class)); } 

    Si consiglia di contrassegnare la tua attività come singola istanza per evitare istanze di più app:

     android:launchMode="singleInstance" 
     public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(!hasFocus) { Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } 
     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); } } 

    Questo è meglio probabilmente ma ancora non hanno trovato nulla vicino per distriggersre il button!

    È ansible creare un elenco nero e aggiungere "com.android.systemui" in it.then avviare un servizio, aprire loop infinito per controllare il TopPackageName, se quella blacklist lo contiene, avviare l'attività propria. se non è chiaro, mi dispiace per il mio cattivo inglese.

    e il codice:

     public class MyService extends Service{ private HashSet<String> blackPackages = new HashSet<String>(); @Override public void onCreate() { m_black_packages.add("com.android.systemui"); while(true){ if(blackPackages.contains(getTopPackage(MyApplication.context)){ //start you own activity } } } public String GetTopPackage(Context context) { int version=android.os.Build.VERSION.SDK_INT; if(version>=21) { long ts = System.currentTimeMillis(); UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats"); List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats( UsageStatsManager.INTERVAL_BEST, ts - 86400000, ts); if (usageStats == null || usageStats.size() == 0) { return getTopPackageLegacy(context); } Collections.sort(usageStats, mRecentComp); return usageStats.get(0).getPackageName(); } else { return getTopPackageLegacy(context); } } public String getTopPackageLegacy(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); @SuppressWarnings("deprecation") List<RunningTaskInfo> tasks = am.getRunningTasks(1); if (tasks.size() == 0) { return null; } RunningTaskInfo task = tasks.get(0); ComponentName cn = task.topActivity; String package_name = cn.getPackageName(); return package_name; } private static class RecentUseComparator implements Comparator<UsageStats> { @Override public int compare(UsageStats lhs, UsageStats rhs) { return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : (lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1; } } 

    }

    questo non è codice originale, ma qualcosa di simile.

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