Je sais que cette question a déjà été posée ici Android Désactiver le bouton de tâche récente comme dans SureLock , mais comme la réponse ne fonctionne pas, certains peuvent peut-être partager un peu de lumière sur ce sujet oublié.
J'ai aussi essayé:
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);
}
mais pas de chance
Faire cela n'est pas du tout difficile. Je l'ai implémenté dans l'une de mes applications et cela fonctionne parfaitement.
Étape 1
Ajouter cette permission au fichier manifest.xml
<uses-permission Android:name="Android.permission.REORDER_TASKS" />
Étape 2
Placez ce code dans n’importe quelle Activity
sur laquelle vous voulez bloquer/désactiver le bouton des applications récentes
@Override
protected void onPause() {
super.onPause();
ActivityManager activityManager = (ActivityManager) getApplicationContext()
.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.moveTaskToFront(getTaskId(), 0);
}
J'ai essayé dans plusieurs appareils et cela fonctionne parfaitement. Appuyez sur le bouton des applications récentes pour que l'écran devienne noir pendant moins d'une seconde, mais que votre activité revienne.
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);
}
}
C'est probablement mieux, mais je n'ai toujours rien trouvé de près pour désactiver le bouton!
Vous pouvez créer une liste noire et ajouter "com.Android.systemui" dans it.then puis démarrer un service, ouvrir une boucle infinie pour vérifier le TopPackageName. ,Désolé pour mon mauvais anglais.
et le code:
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;
}
}
}
ce n'est pas du code original, mais quelque chose comme ça.
Cette réponse m'a aidé . Ce n'est pas le meilleur car certaines méthodes sont maintenant obsolètes. Cela fonctionne pour moi (4.4.2) pour l'instant, mais j'aimerais aussi trouver une solution plus idéale.
@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();
}
}
};
Avec cette permission:
<uses-permission Android:name="Android.permission.GET_TASKS" />
@Tazz Vous venez ne pouvez pas. Impossible.
Oui, c'est frustrant, les systèmes d'exploitation le sont parfois. Je rencontre souvent des problèmes comme celui-ci pour avoir besoin de conceptions avancées. Ici, vous frappez un mur. Le système d'exploitation ne fournit pas la fonctionnalité, il est hors de votre pouvoir de développeur. C'est annulant mais t-r-u-e, vous ne pouvez pas. Même une prime ne transformera pas SDK en Magic.
Eventuellement ET si votre application est dédiée à des périphériques internes - et non à des publications - vous pouvez modifier le code dans le SDK Android - il est opensource. Si vous avez l'intention de publier sur le Play Store, cela ne sert à rien.