Il codice dietro il pulsante di arresto forzato è complesso e non documentato. Lo riprodurrò alla lettera e poi lo esaminerò un pezzo alla volta.
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 prima if
riga verifica se qualche componente del pacchetto è un amministratore del dispositivo (ovvero, se è selezionato nell'elenco Amministratori dispositivo nella pagina Sicurezza dell'app Impostazioni ). In tal caso, il pulsante è disabilitato ( disattivato ) quindi non è possibile interrompere gli amministratori del dispositivo.
Quindi, else if
controlla se il pacchetto è già stato arrestato . Qui, fermato non significa semplicemente "non correre". Per quanto ne so, un pacchetto è nello stato di arresto se non hai mai eseguito alcun componente da esso (ad esempio avviandolo dal menu) o se hai premuto un pulsante di arresto forzato (questo o in una finestra di dialogo "smesso di funzionare") e non eseguire nuovamente nessuno dei suoi componenti. Se il pacchetto non è stato arrestato, il pulsante è abilitato .
Il else
caso riguarda la rara eventualità che un'app sia stata arrestata e non sia un amministratore del dispositivo. In questo caso, dà altro servizi di sistema la possibilità di abilitare il pulsante. Ad esempio, l'app potrebbe avere un allarme impostato e in sospeso, che in seguito causerebbe il riavvio dell'app anche dallo stato di arresto. In questo caso, il pulsante sarà abilitato. Se nessun altro servizio di sistema ha un motivo per abilitare il pulsante, verrà disabilitato.
Sommario
Il pulsante Force stop è abilitato se il pacchetto non è un amministratore del dispositivo e o non hai già forzato l'arresto di questa app o l'hai forzata, ma un servizio di sistema pensa che verrà eseguita di nuovo.
Se l'app è in esecuzione (e non è un amministratore del dispositivo), il pulsante di arresto forzato sarà sicuramente abilitato, ma il pulsante che viene abilitato non significa che l'app è in esecuzione.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
, puoi fornire un'app di esempio con questo comportamento? Ho appena sfogliato alcune delle mie app e ho scoperto che sono attivati i pulsanti "Force Stop" e "Uninstall". Sono su Android 4.4.2.