Kod za zatrzymania Sił przycisku jest skomplikowane i nieudokumentowane. Powielę to dosłownie, a następnie przejrzę to po jednym kawałku.
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);
}
}
Pierwszy if
wiersz sprawdza, czy którykolwiek składnik pakietu jest administratorem urządzenia (tzn. Czy jest zaznaczony na liście Administratorzy urządzenia na stronie Zabezpieczenia aplikacji Ustawienia ). Jeśli tak, przycisk jest wyłączony (wyszarzony), więc nie można zatrzymać administratorów urządzenia.
Następnie else if
sprawdza, czy pakiet jest już zatrzymany . Tutaj zatrzymany nie oznacza tylko „nie działa”. O ile mi wiadomo, pakiet jest w stanie zatrzymania, jeśli nigdy nie uruchomiłeś z niego żadnego komponentu (na przykład poprzez uruchomienie go z menu) lub jeśli nacisnąłeś przycisk Force stop (ten lub w okno dialogowe „przestał działać”) i nie uruchamiaj ponownie żadnego z jego składników. Jeśli pakiet nie został zatrzymany, przycisk jest włączony .
else
Przypadek obejmuje rzadką ewentualność, że aplikacja nie została zatrzymana i nie jest administratorem urządzenia. W takim przypadku daje innym usługom systemowym szansę na włączenie przycisku. Na przykład aplikacja może mieć ustawiony i oczekujący alarm, co później spowoduje ponowne uruchomienie aplikacji nawet ze stanu zatrzymania. W takim przypadku przycisk zostanie włączony. Jeśli żadna inna usługa systemowa nie ma powodu, aby włączyć przycisk, zostanie on wyłączony.
Podsumowanie
Przycisk Wymuś zatrzymanie jest włączony, jeśli pakiet nie jest administratorem urządzenia i albo nie wymusiłeś już tej aplikacji, albo wymusiłeś ją, ale usługa systemowa myśli, że uruchomi ją ponownie.
Jeśli aplikacja jest uruchomiona (i nie jest administratorem urządzenia), przycisk Force stop na pewno będzie włączony, ale włączenie przycisku nie oznacza, że aplikacja jest uruchomiona.
You will notice this when the "Force Stop" button is active, the "Uninstall" (or "Remove") button is grayed out
, czy możesz podać przykładową aplikację, która ma takie zachowanie? Właśnie przejrzałem niektóre z moich aplikacji i odkryłem, że przyciski „Force Stop” i „Uninstall” są aktywne. Jestem na Androidzie 4.4.2.