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 if
linha 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 if
verifica 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 else
caso 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.