背後にあるコードを強制停止ボタンが複雑で文書化されていないです。私はそれを逐語的に再現してから、一度に1つずつ説明します。
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);
}
}
最初のif
行では、パッケージのコンポーネントがデバイス管理者であるかどうかを確認します(つまり、設定アプリの[ セキュリティ]ページの[ デバイス管理者]リストで確認されている場合)。その場合、ボタンは無効(グレー表示)になっているため、デバイス管理者を停止することはできません。
次に、else if
パッケージがすでに停止しているかどうかを確認します。ここで、停止とは、単に「実行されていない」という意味ではありません。私の知る限り、パッケージはである停止します(そのようなメニューから起動することによってのように)それから、任意のコンポーネントを実行したことがない場合の状態、またはあなたが押した場合は強制停止ボタン(この1かでを「動作停止」ダイアログ)、そのコンポーネントのいずれも再度実行しないでください。パッケージが停止されていない場合、ボタンは有効になっています。
このelse
ケースは、アプリが停止され、デバイス管理者ではないというまれな事態をカバーしています。この場合、他のシステムサービスにボタンを有効にする機会を与えます。たとえば、アプリにはアラームが設定されて保留されている場合があります。これにより、後で停止状態からでもアプリが再起動されます。この場合、ボタンは有効になります。他のシステムサービスにボタンを有効にする理由がない場合、無効になります。
概要
強制停止パッケージは、デバイスの管理者でない場合はボタンが有効になっていると、あなたはすでに強制的に停止していないのいずれか、このアプリをしたり、それを力に停止しているが、システムサービスは、それが再びそれを実行します考えています。
アプリが実行されている場合(デバイス管理者ではない場合)、強制停止ボタンは確実に有効になりますが、ボタンが有効であってもアプリが実行されているわけではありません。
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
、この動作をしているサンプルアプリを提供できますか?アプリのいくつかをざっと見てみたところ、「強制停止」ボタンと「アンインストール」ボタンの両方がアクティブになっていることがわかりました。私はAndroid 4.4.2を使用しています。