El código detrás del botón de detención de Force es complejo e indocumentado. Lo reproduciré literalmente y luego lo revisaré una pieza a la vez.
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);
}
}
La primera if
línea verifica si algún componente del paquete es un administrador del dispositivo (es decir, si está marcado en la lista de administradores del dispositivo en la página Seguridad de la aplicación Configuración ). Si es así, el botón está deshabilitado (atenuado) para que no pueda detener a los administradores del dispositivo.
Luego, else if
comprueba si el paquete ya está detenido . Aquí, detenido no solo significa "no correr". Por lo que puedo decir, un paquete está en estado detenido si nunca ha ejecutado ningún componente desde él (como al iniciarlo desde el menú), o si ha presionado un botón Forzar detención (este o en un cuadro de diálogo "dejó de funcionar") y no vuelva a ejecutar ninguno de sus componentes. Si el paquete no se ha detenido, el botón está habilitado .
El else
caso cubre la rara posibilidad de que una aplicación se haya detenido y no sea un administrador del dispositivo. En este caso, le da a otros servicios del sistema la oportunidad de habilitar el botón. Por ejemplo, la aplicación podría tener una alarma configurada y pendiente, lo que luego provocaría que la aplicación se reiniciara incluso desde el estado detenido. En este caso, el botón estará habilitado. Si ningún otro servicio del sistema tiene un motivo para habilitar el botón, se desactivará.
Resumen
El botón Forzar detención está habilitado si el paquete no es un administrador del dispositivo y si aún no ha detenido forzosamente esta aplicación o la ha forzado pero un servicio del sistema cree que la volverá a ejecutar.
Si la aplicación se está ejecutando (y no es un administrador de dispositivo), el botón Forzar detención definitivamente se habilitará, pero el botón que se habilita no significa que la aplicación se esté ejecutando.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
, ¿puedes dar una aplicación de ejemplo que tenga este comportamiento? Acabo de hojear algunas de mis aplicaciones y descubrí que los botones "Forzar detención" y "Desinstalar" están activados. Estoy en Android 4.4.2.