Der Code hinter der Schaltfläche " Stopp erzwingen" ist komplex und nicht dokumentiert. Ich reproduziere es wörtlich und gehe es dann Stück für Stück durch.
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);
}
}
In der ersten if
Zeile wird geprüft, ob eine Komponente des Pakets ein Geräteadministrator ist ( dh , ob sie in der Liste der Geräteadministratoren auf der Seite Sicherheit der App Einstellungen aktiviert ist). In diesem Fall ist die Schaltfläche deaktiviert (ausgegraut), sodass Sie Geräte-Administratoren nicht stoppen können.
Anschließend wird else if
geprüft, ob das Paket bereits gestoppt ist . Angehalten heißt hier nicht nur "nicht rennen". Soweit ich das beurteilen kann, befindet sich ein Paket im gestoppten Zustand, wenn Sie noch nie eine Komponente ausgeführt haben (z. B. indem Sie sie über das Menü starten) oder wenn Sie eine Schaltfläche zum Erzwingen des Stopps gedrückt haben (diese oder diese) ein "funktioniert nicht mehr" -Dialog) und führen Sie keine seiner Komponenten erneut aus. Wenn das Paket nicht gestoppt wurde, ist die Schaltfläche aktiviert .
Der else
Fall deckt den seltenen Fall , dass eine Anwendung wird gestoppt worden und ist kein Vorrichtungs - Administrator. In diesem Fall können andere Systemdienste die Schaltfläche aktivieren. Beispielsweise könnte für die App ein Alarm eingestellt und anstehend sein, wodurch die App später selbst aus dem gestoppten Zustand heraus erneut gestartet wird. In diesem Fall wird die Schaltfläche aktiviert. Wenn kein anderer Systemdienst einen Grund hat, die Schaltfläche zu aktivieren, wird sie deaktiviert.
Zusammenfassung
Die Schaltfläche " Stopp erzwingen" ist aktiviert, wenn das Paket kein Geräteadministrator ist und Sie diese App entweder noch nicht erzwungen oder erzwungen haben, aber ein Systemdienst denkt, dass sie erneut ausgeführt wird.
Wenn die App ausgeführt wird (und kein Geräteadministrator ist), ist die Schaltfläche " Stopp erzwingen" definitiv aktiviert. Die aktivierte Schaltfläche bedeutet jedoch nicht, dass die App ausgeführt wird.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
Können Sie eine Beispiel-App nennen, die dieses Verhalten aufweist? Ich habe gerade einige meiner Apps durchgesehen und festgestellt, dass die Schaltflächen "Stop erzwingen" und "Deinstallieren" aktiviert sind. Ich bin auf Android 4.4.2.