Android, comment faire pour effacer la récente liste des tâches qui pourraient obtenir de la Maison de bouton dans la plupart des téléphone? La réflexion est une voie possible?
Je suis en train d'écrire un Lanceur, il faut bien le récent app/liste des tâches du système, et non pas "à ne pas montrer mes applications au cours des dernières de la liste des tâches", mais je n'ai aucune idée à ce sujet maintenant.
J'ai cherché dans le stackoverflow et seulement ce problème est assorti mais la réponse n'a pas d'aide.
Un gars a posé les mêmes questions, il a le dessus décrite RemoveTask qui vient d'Android 4.0.
Oui, j'ai vérifié le code source d'Android 2.3.7 et Android 4.0, un tour estime, je pense que j'aurais presque pu atteindre le point de fin si je peux effacer la liste des mRecentTasks qui sont définis dans le ActivityMangerService.Java :
final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>();
Et un autre peut-être utile de définition:
static ActivityManagerService mSelf;
public static ActivityManagerService self() {
return mSelf;
}
Parce que je ne suis pas familier avec Java&refelction, j'ai besoin d'aide sur la façon de désactiver cette liste, ci-dessous le code de mon:
public static <T> void clearRecentTaskList(Launcher launcher){
ActivityManager am = (ActivityManager) launcher.getSystemService(Context.ACTIVITY_SERVICE);
Object systemRecentTask = new ArrayList<T>();
Object receiver = null;
Field recentTaskList = null;
Class<?> service = null;
Field self = null;
try {
service = Class.forName("com.android.server.am.ActivityManagerService");
Log.d(LOG_TAG, "clearRecentTaskList, service gotton"+service.getName());
} catch (ClassNotFoundException e2) {
Log.d(LOG_TAG, "clearRecentTaskList, class service not found");
}
try {
self = service.getDeclaredField("mSelf");
} catch (SecurityException e2) {
Log.d(LOG_TAG, "clearRecentTaskList, SecurityException during get mSelf");
} catch (NoSuchFieldException e2) {
Log.d(LOG_TAG, "clearRecentTaskList, NoSuchFieldException during get mSelf");
}
Log.d(LOG_TAG, "clearRecentTaskList, self gotton " + self.toGenericString());
try {
self.setAccessible(true);
receiver = self.get(null);
} catch (IllegalArgumentException e2) {
Log.d(LOG_TAG, "clearRecentTaskList, IllegalArgumentException during use self to get the receiver");
} catch (IllegalAccessException e2) {
Log.d(LOG_TAG, "clearRecentTaskList, IllegalAccessException during use self to get the receiver");
}
if ( receiver != null){
Log.d(LOG_TAG, "clearRecentTaskList, receiver is : "+receiver.toString());
} else {
Log.d(LOG_TAG, "clearRecentTaskList, receiver is NULL");
}
try {
recentTaskList = service.getDeclaredField("mRecentTasks");
recentTaskList.setAccessible(true);
Log.d(LOG_TAG, "clearRecentTaskList, recentTaskList gotton"+recentTaskList.toGenericString());
try {
systemRecentTask = recentTaskList.get(receiver);
} catch (IllegalArgumentException e1) {
Log.d(LOG_TAG, "IllegalArgumentException during try to clearRecentTask");
} catch (IllegalAccessException e1) {
Log.d(LOG_TAG, "IllegalAccessException during try to clearRecentTask");
}
Log.d(LOG_TAG, "Try to print the size of recent task: "+((ArrayList<T>) systemRecentTask).size());
} catch (SecurityException e) {
Log.d(LOG_TAG, "SecurityException during try to clearRecentTask");
} catch (NoSuchFieldException e) {
Log.d(LOG_TAG, "NoSuchFieldException during try to clearRecentTask");
}
}
Avec cette fonction, je rencontre toujours le "NullPointerException" parce que le récepteur est null, qui a obtenu par soi-même. Et j'ai essayé une autre manière comme cela(Si j'ai supprimer tous les try/catch):
self = service.getDeclaredMethod("mSelf", null);
receiver = self.invoke(null, null); //mSelf is a static method which in ActivityMangerService class
Le même résultat, je ne peux pas obtenir l'instance de ActivityManagerService et puis je ne peux pas obtenir le mRecentTasks.
Tout commentaire est apprécié, et bien que je ne sais pas "comment faire pour supprimer tous les éléments dans cette liste, mais ce pourrait être un autre questions.
Grâce.
Non exposée de l'API est susceptible de changer à chaque mise à jour/mise à jour, qui va break votre application. Mieux vaut avoir votre propre applications récentes de la liste composant.
J'espère que cela est protégé par une permission que seul le firmware applications peuvent tenir, même si il y a une lame de script-kiddie façon de pirater votre chemin.
certains le gestionnaire des tâches de permettre à l'utilisateur de nettoyer la trace, les Applications cibles de Lanceur comme Go Launcher, il pourrait vraiment clair "la récente liste de tâches". J'ai besoin d'effacer d'autres applications de l'histoire mais pas se cacher moi, même si je savais comment le faire:). La question actuelle est de savoir comment obtenir l'instance de ActivityManagerService, j'ai fait quelques tests, mais quand même eu un résultat négatif.
il me semble que c'est plus sur un pied d'égalité avec la suppression de l'historique du navigateur, ou d'effacer les cookies que "l'autorisation que seul le firmware applications peut s'en tenir". Le "pédo-lock" s'agit d'une situation qui est mal géré dans Android en général.
OriginalL'auteur Red Zhen | 2012-10-15
Vous devez vous connecter pour publier un commentaire.
Alors que je pourrait ai édité ma réponse, cette solution je l'ai utilisé dans un autre projet est donc, de manière exhaustive, les différents (et plus facile), il est mieux de repartir à zéro...
Dans ce cas, j'ai simplement utilisé de la réflexion pour accéder à la removeTask() la méthode de la ActivityManager, et j'ai regroupé tout cela dans une classe commodité de MyActivityManager comme suit:
Ensuite, quand je veux effacer les tâches récentes je ne les suivants:
Il est possible que l'un des deux ou les deux sont nécessaires pour que cela fonctionne:
Dans mon cas, l'application est installée avec le système d'autorisations.
OriginalL'auteur karora
La meilleure façon que j'ai trouvé est de faire ceci:
Ce n'est pas mon propre code, mais cela masque les applications récentes de la liste de montrer.
OriginalL'auteur Quintin Balsdon
Il y a quelques bons indices quant à la façon de le faire sur cette question ici:
Modifier le résultat de getRecentTasks
Suite à cela, j'ai pris l'approche suivante pour mes propres fins (une situation similaire, où les comprimés sont prêtés à des gens et puis quelqu'un a à "effacer l'historique" avant de les transmettre à la personne suivante).
Tout d'abord, dans mon manifeste, j'ai créé 18 tâches comme ceci:
D'autre part, dans une AsyncTask que je commence lorsque l'assistant de démarrage "page d'Accueil" pour la prochaine personne à utiliser la tablette, après je effacer l'historique du navigateur et les cookies, je ne les suivants:
Alors que j'ai utilisé "Thread.sleep(20)" entre le lancement de chaque tâche, je n'ai pas étudié en détail exactement ce qui est nécessaire, et peut-être un temps plus court. Pour ma buts à 1 seconde de retard alors que ceux-ci sont supprimés n'est pas problématique.
La finale ingrédients sont les dix-huit (très simple) des activités qui sont en cours de démarrage, qui ressemble à ceci:
Espère que cela est utile.
OriginalL'auteur karora
Je viens de rencontrer le même problème. Bon, je ne sais pas comment effacer la liste récente, mais je sais, comment ne pas mettre votre application.
démarrer avec: FLAG_ACTIVITY_NO_HISTORY drapeau .
Cela a fonctionné pour moi, j'espère que je peux vous aider avec elle pour vous.
Cheers,
détails:
min SDK niveau 14
OriginalL'auteur Karoly