Ich schreibe einen Launcher, es muss die aktuelle App/Aufgabenliste vom System löschen, nicht "habe meine Apps nicht in der letzten Aufgabenliste angezeigt", aber ich habe keine Ahnung davon. Ich habe im Stackoverflow gesucht und nur this issue ist abgestimmt, aber die Antwort hat keine Hilfe. Ein anderer Typ hat die gleichen Fragen gestellt, er erinnerte sich an die RemoveTask, die von Android 4.0 kommt. Ja, ich habe den Quellcode von Android 2.3.7 und Android 4.0 überprüft, bei einer Runde geschätzt, ich denke, ich könnte fast den Endpunkt erreichen, wenn ich die Liste der mRecentTasks löschen kann, die in ActivityMangerService.Java definiert:Android, wie man die letzte Aufgabenliste löscht, die vom Hauptknopf in den meisten Telefonen erhalten könnte? Reflexion ist ein möglicher Weg?
final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>();
Und eine andere vielleicht nützliche Definition:
static ActivityManagerService mSelf;
public static ActivityManagerService self() {
return mSelf;
}
Weil ich mit Java & nicht vertraut bin refelction, ich brauche über die Art und Weise helfen, die klar, dass diese Liste, unten ist der Code meines:
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");
}
}
Mit dieser Funktion erfülle ich immer die "NullPointerException", weil der Empfänger null ist, der von selbst erhalten wurde. Und ich habe eine andere Art und Weise, wie diese versucht (Wenn ich die alle try/catch entfernen):
self = service.getDeclaredMethod("mSelf", null);
receiver = self.invoke(null, null); // mSelf is a static method which in ActivityMangerService class
Das gleiche Ergebnis kann ich nicht die Instanz von ActivityManagerService bekommen und dann kann ich nicht die mRecentTasks bekommen. Irgendwelche Kommentare werden geschätzt und obwohl ich nicht weiß, "wie man alle Einzelteile in dieser Liste löscht", aber es könnte andere Fragen sein.
Danke.
Ich verstehe nicht, welche Art von Launcher Sie schreiben ... Warum sollten Sie die Liste der letzten Programme löschen? Es klingt für mich wie ein Sicherheits-Exploit oder zumindest so, als würden Sie Android-Standardverhalten auf eine sehr unangenehme Weise überschreiben. Zum Beispiel könnte sich ein Malware-Programm verstecken ... – Radu
Nicht exponierte API wird sich wahrscheinlich mit jeder Version/jedem Update ändern, was zu _break_ Ihrer App führt. Bessere eigene _recent apps list_ Komponente. –
Hoffentlich ist dies durch eine Erlaubnis geschützt, die nur Firmware-Apps halten können, selbst wenn es einen lahmen Skript-Kiddie-Weg gibt, um sich hineinzuhacken. – CommonsWare