2011-06-29 9 views
11

Moja aplikacja na Androida ma WebView, która wymaga wtyczki Flash. Przeglądarka udostępni link do rynku Adobe Flash, jeśli nie jest zainstalowany. Po zainstalowaniu Flasha jedynym sposobem na utworzenie instancji w mojej aplikacji jest wymuszenie zamknięcia i ponownego uruchomienia aplikacji. Chciałbym przedstawić użytkownikowi przycisk, który robi to za niego, ponieważ jest zbyt skomplikowany dla zwykłych użytkowników, aby otworzyć swoje działające procesy i wymusić ręczne zamknięcie aplikacji. Jaki jest kod Java do wdrożenia takiego przycisku restartu?Jak wymusić zamknięcie aplikacji na Androida i zrestartować ją?

+3

Dlaczego dokładnie trzeba wymusić zakończenie i ponownie uruchomić aplikację, aby zainicjować rzeczy? Po ponownym zainstalowaniu lampy błyskowej wywołaj kod inicjujący. –

+1

Czy naprawdę potrzebujesz zamknąć samą aplikację? Czy wystarczy zamknięcie działania, które obsługuje WebView, nie wystarczy? – Squonk

+1

Wyjątek wyjątku: P –

Odpowiedz

27

można ponownie uruchomić aplikację w dwóch etapach:

  1. Zabij swój własny proces. Użyj numeru Process.myPid(), przekazując go do Process.killProcess(). Aby to zadziałało, może być konieczne dodanie uprawnienia do manifestu (prawdopodobnie android.permission.KILL_BACKGROUND_PROCESSES).
  2. Zanim zabijesz własny proces, zarejestruj alarm z oczekującym zamiarem ponownego uruchomienia swojej działalności w najbliższej przyszłości. Drugim parametrem dla alarm.set jest triggerAtTime. Ustawienie na 0 powoduje natychmiastowe uruchomienie alarmu. Przykład tutaj ustawia czas, aby uruchomić aplikację sekundę w przyszłość.

Kodeks idzie tak:

AlarmManager alm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
alm.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()), 0)); 
+0

Jak uzyskać dostęp do tego obiektu 'Process' z mojego głównego" Activity "? – JoJo

+0

Te metody w procesie są statyczne. Powinieneś po prostu móc do nich zadzwonić. – mportuesisf

+0

Tak, to działa. Mamy przycisk administratora, który wykonuje czyste zamknięcie różnych rzeczy przed wywołaniem 'Process.sendSignal (Process.myPid(), Process.SIGNAL_KILL)' – jtoberon

0

Przypuszczam, że można zadzwonić pod numer finish, aby zatrzymać aktywność, ale nie będzie można ponownie uruchomić aplikacji. To wymagałoby (jeśli to możliwe) root i byłby to okropny pomysł. Oznaczałoby to, że jakakolwiek aplikacja mogłaby się uruchomić, gdy tylko by chciała: co jest złym pomysłem i faktycznie byłaby błędem, gdyby była możliwa.

+0

Czy 'Activity.finish' faktycznie wymusza zamknięcie aplikacji? Wygląda na to, że tylko zapamiętuje aplikację w pamięci. Kiedy uruchomiłem kod, zamknęło aplikację. Ale kiedy poszedłem zarządzać aplikacją, przycisk "Wymuś zatrzymanie" był nadal aktywny. Ten przycisk powinien być wyłączony, jeśli aplikacja nie znajduje się w pamięci. Z jakiegoś powodu Flash wymaga, aby aplikacja była poza pamięcią, a następnie ponownie uruchomiona, aby mogła zostać rozpoznana przez "WebView". – JoJo

+0

@JoJo: Activity.finish zamyka tylko bieżącą aktywność. Czy zakończyłeś wszystkie czynności w aplikacji lub tylko jedną? Ponieważ jeśli jakieś działania lub procesy w tle nadal istnieją, to oczywiście aplikacja nadal będzie istniała. –

+0

Dodałem 'this.finish()' na końcu 'Activity.onCreate'. Tak więc po uruchomieniu aplikacji natychmiast się zamyka. Czy nie powinno to spowodować zamknięcia jedynej działalności? – JoJo

-1

można wyjście z aplikacji z System.exit (0): ten nie wymaga pozwolenia na swojej aplikacji

Powiązane problemy