Tôi đang viết Trình chạy, cần xóa danh sách ứng dụng/tác vụ gần đây từ hệ thống chứ không phải "không hiển thị ứng dụng của tôi trong danh sách nhiệm vụ gần đây", nhưng hiện tại tôi không có ý tưởng gì về nó. Tôi đã tìm kiếm trong ngăn xếp và chỉ this issue được khớp nhưng câu trả lời không có bất kỳ trợ giúp nào. Một số người khác đã hỏi những câu hỏi tương tự, ông đã metioned RemoveTask mà đến từ Android 4.0. Có, tôi đã kiểm tra mã nguồn của Android 2.3.7 và Android 4.0, với ước tính vòng, tôi nghĩ rằng tôi gần như có thể đạt đến điểm kết thúc nếu tôi có thể xóa danh sách mRecentTasks được xác định trong ActivityMangerService.Java:Android, cách xóa danh sách tác vụ gần đây có thể nhận được từ nút Trang chủ trong hầu hết điện thoại? Phản ánh là một cách có thể?
final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>();
Và một định nghĩa có thể hữu ích:
static ActivityManagerService mSelf;
public static ActivityManagerService self() {
return mSelf;
}
Bởi vì tôi không quen thuộc với Java & refelction, tôi cần giúp đỡ về cách mà rõ ràng danh sách này, dưới đây là mã của tôi:
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");
}
}
Với chức năng này, tôi luôn đáp ứng "NullPointerException" bởi vì người nhận là null có được tự. Và tôi đã cố gắng một cách khác như thế này (Nếu tôi loại bỏ tất cả try/catch):
self = service.getDeclaredMethod("mSelf", null);
receiver = self.invoke(null, null); // mSelf is a static method which in ActivityMangerService class
Các kết quả tương tự, tôi không thể có được sự thể hiện của ActivityManagerService và sau đó tôi không thể nhận được mRecentTasks. Bất kỳ nhận xét nào được đánh giá cao và mặc dù tôi không biết "cách xóa tất cả các mục trong danh sách này", nhưng đó có thể là một câu hỏi khác.
Cảm ơn.
Tôi không hiểu loại trình khởi chạy bạn đang viết ... tại sao bạn nên xóa danh sách chương trình gần đây? Nó chỉ âm thanh với tôi như một khai thác an ninh, hoặc ít nhất là bạn đang ghi đè hành vi mặc định của Android theo một cách rất khó chịu. Ví dụ: một chương trình phần mềm độc hại có thể tự ẩn mình ... – Radu
API không tiếp xúc có thể thay đổi với mọi bản phát hành/bản cập nhật sắp được khởi chạy ứng dụng của bạn. Tốt hơn có thành phần list_ ứng dụng _recent của riêng bạn. –
Hy vọng rằng, điều này được bảo vệ bởi sự cho phép mà chỉ các ứng dụng phần mềm mới có thể giữ, ngay cả khi có cách viết kịch bản-kiddie để hack theo cách của bạn vào nó. – CommonsWare