Le code derrière le bouton d' arrêt forcé est complexe et non documenté. Je vais le reproduire textuellement, puis le parcourir une pièce à la fois.
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 première if
ligne vérifie si un composant du package est un administrateur de périphérique (c'est-à-dire s'il est vérifié dans la liste Administrateurs de périphériques de la page Sécurité de l' application Paramètres ). Si c'est le cas, le bouton est désactivé (grisé), vous ne pouvez donc pas arrêter les administrateurs de l'appareil.
Ensuite, il else if
vérifie si le package est déjà arrêté . Ici, arrêter ne signifie pas seulement "ne pas courir". Pour autant que je sache, un package est à l' état arrêté si vous n'en avez jamais exécuté de composant (par exemple en le lançant à partir du menu), ou si vous avez appuyé sur un bouton d' arrêt forcé (celui-ci ou une boîte de dialogue "ne fonctionne plus") et ne réexécutez aucun de ses composants. Si le package n'a pas été arrêté, le bouton est activé .
L' else
affaire couvre la rare éventualité où une application a été arrêtée et n'est pas un administrateur d'appareil. Dans ce cas, cela donne à d'autres services système la possibilité d'activer le bouton. Par exemple, l'application peut avoir une alarme définie et en attente, ce qui entraînerait plus tard le redémarrage de l'application même à partir de l'état arrêté. Dans ce cas, le bouton sera activé. Si aucun autre service système n'a de raison d'activer le bouton, il sera désactivé.
Sommaire
Le bouton Forcer l'arrêt est activé si le package n'est pas un administrateur d'appareil et que vous n'avez pas déjà forcé l'arrêt de cette application ou que vous l'avez forcé mais un service système pense qu'il le réexécutera.
Si l'application est en cours d'exécution (et qu'il ne s'agit pas d'un administrateur d'appareil), le bouton d' arrêt forcé sera définitivement activé, mais le bouton activé ne signifie pas que l'application est en cours d'exécution.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
, pouvez-vous donner un exemple d'application qui présente ce comportement? Je viens de parcourir certaines de mes applications et j'ai constaté que les boutons "Forcer l'arrêt" et "Désinstaller" étaient activés. Je suis sur Android 4.4.2.