El código detrás del Forzar la parada botón es complejo y no está documentado. Lo reproduzco textualmente y luego lo repaso pieza por pieza.
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
comprueba si alguna línea componente del paquete es un administrador del dispositivo (es decir, si está marcado en el Administradores de dispositivos lista en el Seguridad página del Ajustes app). Si es así, el botón es discapacitados (en gris) para que no puedas detener a los administradores de dispositivos.
Entonces, el else if
comprueba si el paquete ya está se detuvo . En este caso, parado no sólo significa "sin funcionar". Hasta donde yo sé, un paquete está en el se detuvo si nunca ha ejecutado ningún componente desde él (por ejemplo, lanzándolo desde el menú), o si ha pulsado un Forzar la parada (éste o en un diálogo de "ha dejado de funcionar") y no volver a ejecutar ninguno de sus componentes. Si el paquete no ha se ha detenido, el botón es habilitado .
El else
caso cubre la rara eventualidad de que una aplicación tiene ha sido detenido y no es un administrador de dispositivos. En este caso, da otros servicios del sistema la posibilidad de habilitar el botón. Por ejemplo, la aplicación podría tener una alarma establecida y pendiente, lo que haría que la aplicación se iniciara de nuevo incluso desde el estado detenido. En este caso, el botón será habilitado. Si ningún otro servicio del sistema tiene una razón para habilitar el botón, se desactivará.
Resumen
El Forzar la parada se activa si el paquete no es un administrador de dispositivos y o bien no has forzado la parada de esta aplicación o la has forzado pero un servicio del sistema cree que la va a volver a ejecutar.
Si la aplicación se está ejecutando (y no es un administrador del dispositivo), el Forzar la parada estará definitivamente habilitado, pero que el botón esté habilitado no significa que la aplicación se esté ejecutando.