O código por trás do botão Parar força é complexo e não documentado. Vou reproduzi-lo literalmente e depois analisá-lo um pedaço de cada 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);
}
}
A primeira iflinha verifica se algum componente do pacote é um administrador de dispositivos (ou seja, se ele foi verificado na lista Administradores de dispositivos na página Segurança do aplicativo Configurações ). Nesse caso, o botão está desativado (acinzentado) para que você não possa parar os administradores do dispositivo.
Em seguida, else ifverifica se o pacote já está parado . Aqui, parado não significa apenas "não rodar". Pelo que sei, um pacote está no estado parado se você nunca executou nenhum componente (como iniciá-lo no menu) ou se pressionou um botão Forçar parada (este ou em uma caixa de diálogo "parou de funcionar") e não execute nenhum de seus componentes novamente. Se o pacote não foi parado, o botão está ativado .
O elsecaso cobre a rara eventualidade de um aplicativo ter sido parado e não ser um administrador de dispositivos. Nesse caso, ele oferece a outros serviços do sistema a chance de ativar o botão. Por exemplo, o aplicativo pode ter um alarme definido e pendente, o que mais tarde faria com que o aplicativo fosse reiniciado mesmo no estado parado. Nesse caso, o botão será ativado. Se nenhum outro serviço do sistema tiver um motivo para ativar o botão, ele será desativado.
Sumário
O botão Forçar parada é ativado se o pacote não for um administrador de dispositivos e você ainda não interrompeu o aplicativo forçadamente ou o interrompeu à força, mas um serviço do sistema acha que o executará novamente.
Se o aplicativo estiver em execução (e não for um administrador do dispositivo), o botão Forçar parada definitivamente estará ativado, mas o botão ativado não significa que o aplicativo está em execução.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out, você pode dar um exemplo de aplicativo que está tendo esse comportamento? Acabei de ler alguns dos meus aplicativos e descobri que os botões "Force Stop" e "Uninstall" estão ativados. Estou no Android 4.4.2.