Код позади Force стоп кнопка является сложным и без документов. Я воспроизведу это дословно, а затем пройдусь по одному фрагменту за раз.
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
проверяет, остановлен ли пакет . Здесь остановлено не просто означает «не работает». Насколько я могу судить, пакет находится в состоянии останова, если вы никогда не запускали из него какой-либо компонент (например, запускаете его из меню), или если вы нажали кнопку принудительной остановки (этот или в диалоговое окно "перестал работать") и больше не запускать какие-либо его компоненты. Если пакет не был остановлен, кнопка включена .
else
Дело охватывает редкие случаи , которые приложение уже было остановлено и не является администратором устройства. В этом случае это дает другим системным службам возможность включить кнопку. Например, приложение может иметь установленный и ожидающий сигнал тревоги, что впоследствии приведет к повторному запуску приложения даже из остановленного состояния. В этом случае кнопка будет включена. Если ни у какой другой системной службы нет причины для включения кнопки, она будет отключена.
Резюме
Force стоп кнопка включена , если пакет не является администратором устройства и либо вы еще не принудительно-остановили это приложение или у вас есть сила, остановили его , но система обслуживания думает , что это будет работать снова.
Если приложение работает (и это не администратор устройства), кнопка принудительной остановки обязательно будет включена, но эта кнопка не означает, что приложение запущено.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
Можете ли вы привести пример приложения, которое имеет такое поведение? Я просто просмотрел некоторые из своих приложений и обнаружил, что активированы кнопки «Force Stop» и «Uninstall». Я на Android 4.4.2.