Các mã sau Buộc dừng nút rất phức tạp và không có giấy tờ. Tôi sẽ tái tạo nó nguyên văn và sau đó đi qua từng mảnh một.
private void checkForceStop() {
if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
// User can't force stop device admin.
updateForceStopButton(false);
} else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
// If the app isn't explicitly stopped, then always show the
// force stop button.
updateForceStopButton(true);
} else {
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
Uri.fromParts("package", mAppEntry.info.packageName, null));
intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
Activity.RESULT_CANCELED, null, null);
}
}
Dòng đầu tiên if
kiểm tra xem bất kỳ thành phần nào của gói là quản trị viên thiết bị (nghĩa là, nếu nó được kiểm tra trong danh sách Quản trị viên thiết bị trong trang Bảo mật của ứng dụng Cài đặt ). Nếu vậy, nút bị tắt (chuyển sang màu xám) để bạn không thể dừng quản trị viên thiết bị.
Sau đó, else if
kiểm tra nếu gói đã dừng lại . Ở đây, dừng lại không chỉ có nghĩa là "không chạy". Theo như tôi có thể nói, một gói ở trạng thái dừng nếu bạn chưa bao giờ chạy bất kỳ thành phần nào từ nó (chẳng hạn như bằng cách khởi chạy nó từ menu) hoặc nếu bạn đã nhấn nút Buộc dừng (cái này hoặc trong hộp thoại "ngừng hoạt động") và không chạy lại bất kỳ thành phần nào của nó. Nếu gói chưa bị dừng, nút được bật .
Vụ else
việc này bao gồm một trường hợp hiếm hoi là một ứng dụng đã bị dừng và không phải là quản trị viên thiết bị. Trong trường hợp này, nó cung cấp cho các dịch vụ hệ thống khác một cơ hội để kích hoạt nút. Ví dụ: ứng dụng có thể có bộ báo động và đang chờ xử lý, điều này sau đó sẽ khiến ứng dụng được khởi động lại ngay cả từ trạng thái dừng. Trong trường hợp này, nút sẽ được kích hoạt. Nếu không có dịch vụ hệ thống nào khác có lý do để kích hoạt nút này, nó sẽ bị vô hiệu hóa.
Tóm lược
Các Buộc dừng nút được kích hoạt nếu gói không phải là một quản trị viên thiết bị và một trong hai bạn chưa ép dừng lại ứng dụng này hoặc bạn có lực ngưng nó nhưng một dịch vụ hệ thống nghĩ rằng nó sẽ chạy nó một lần nữa.
Nếu ứng dụng đang chạy (và đó không phải là quản trị viên thiết bị), nút Buộc dừng chắc chắn sẽ được bật, nhưng nút được bật không có nghĩa là ứng dụng đang chạy.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
, bạn có thể đưa ra một ứng dụng ví dụ có hành vi này không? Tôi chỉ lướt qua một số ứng dụng của mình và thấy rằng cả hai nút "Buộc dừng" và "Gỡ cài đặt" đều được kích hoạt. Tôi đang dùng Android 4.4.2.