2015-03-25 7 views
22

Jak mogę zakończyć aplikację Xamarin z którejkolwiek z czynności?Jak zakończyć aplikację Xamarin?

Próbowałem zarówno System.Environment.Exit(0) i System.Environment.Exit (1), jak i Finish() i zabicie wszystkich działań.

Wciąż otwiera jedną pustą stronę z domyślną nazwą działania i czarnym ekranem.

Czy istnieje jakieś konkretne rozwiązanie tego problemu?

+2

FYI, Apple zdecydowanie odradza zamykanie aplikacji. Źródło: http://developer.apple.com/library/ios/qa/qa1561/_index.html – angak

Odpowiedz

12

Na Androidzie można zrobić

Android.OS.Process.KillProcess(Android.OS.Process.MyPid()); 

iOS wyraźnie nie przewiduje żadnych API dla istniejących aplikacji. Tylko system operacyjny może zamknąć aplikację.

+0

Miałem zastosowanie tego kodu, ale to również zwraca mi tę samą czarną stronę z tytułem głównej aktywności .... Czy istnieje jakiekolwiek inne rozwiązanie, czy też brakuje mi tam czegoś? – Nik

6

Dla iOS, można użyć tego kodu:

Thread.CurrentThread.Abort(); 

dla systemu Android, jak @Jason wspomniano tutaj:

Android.OS.Process.KillProcess(Android.OS.Process.MyPid()); 
+0

Miałem zastosowanie tego kodu, ale to również zwraca mi tę samą czarną stronę z tytułem głównej działalności .... Czy istnieje jakieś inne rozwiązanie lub czy brakuje mi tam czegoś? – Nik

+3

To działa dla mojej aplikacji. Może nie wywołujesz go z głównego wątku UI? spróbuj zamknąć aplikację wewnątrz tego wyrażenia lambda: Xamarin.Forms.Device.BeginInvokeOnMainThread (() => {Android.OS.Process.KillProcess (Android.OS.Process.MyPid());}); Daj mi znać, jeśli to pomoże. – IdoT

+0

Dziękuję za odpowiedź. I tak chcę zakończyć aplikację z wątku potomnego, a nie główny wątek interfejsu użytkownika, a mój projekt jest w Xamarin.Android nie w Xamarin.Forms, więc czy możesz dać mi rozwiązanie tego? Jeszcze raz dziękuję – Nik

0

Jako oryginalny pytanie wymienia czynności, Twoje pytanie jest specjalnie dla Android, prawdopodobnie powinieneś zaktualizować tytuł pytania, aby uniknąć sytuacji, w których użytkownicy szukają rozwiązania wieloplatformowego.

dla iOS i Android (powiedzmy w Formularzach Xamarin) można po prostu wyrzucić wyjątek, który będąc podejście „ciężką rękę”, będzie wykonać zadanie:

throw new Exception(); 

Jak to nie jest najlepszy wygodę użytkowania i możesz z niego korzystać tylko w systemie iOS, ponieważ na Androidzie pojawi się systemowe okno informujące o awarii aplikacji. Jednak w przeciwieństwie do innych metod iOS, takich jak wywoływanie wyjścia (0) lub wywoływanie prywatnych metod iOS, takich jak "terminateWithSuccess", za pomocą selektora, nie powinno to powodować niepowodzenia sprawdzania oryginalności w sklepie z aplikacjami wyłącznie w oparciu o to, jak to zrobić. Mogą nadal Cię zawieść, ponieważ Twoja aplikacja próbuje się zakończyć.

Możesz zaimplementować coś innego specjalnie dla Androida, w którym odpowiedź mufo Jason jest wystarczająca, ponownie, jeśli nie trochę na nosie tj użyciu tej metody nie mogą pozwolić aplikacja do czyszczenia się w górę:

Android.OS.Process.KillProcess(Android.OS.Process.MyPid()); 

Tak czy inaczej, powinieneś naprawdę zapytać, dlaczego musisz podać tę opcję. W przeciwieństwie do aplikacji biurowych, gdzie zamykanie aplikacji jest potrzebne, ponieważ aplikacje znajdują się w oknach, które z założenia pozwalają na wielozadaniowość i nie są zorientowane na zadania, platformy mobilne są przede wszystkim zaprojektowane tak, aby użytkownicy mogli skoncentrować się na jednym zadaniu na raz. Po zakończeniu zadania użytkownik powinien zdecydować o wyjściu z tego zadania, klikając przycisk strony głównej, przycisk Wstecz lub zmieniający przycisk aplikacji (zadania). To naprawdę dotyczy wszystkich platform.

3

W swojej działalności, użyj tego kodu

this.FinishAffinity(); 
24

Jeśli używasz Xamarin.Forms tworzyć zależności usługi.

Interfejs

public interface ICloseApplication 
{ 
    void closeApplication(); 
} 

Android: Korzystanie FinishAffinity() nie będzie ponowne uruchomienie działalności. Po prostu zamknie aplikację.

public class CloseApplication : ICloseApplication 
{ 
    public void closeApplication() 
    { 
     var activity = (Activity)Forms.Context; 
     activity.FinishAffinity(); 
    } 
} 

IOS: Jak już zasugerowano powyżej.

public class CloseApplication : ICloseApplication 
{ 
    public void closeApplication() 
    { 
     Thread.CurrentThread.Abort(); 
    } 
} 

UWP

public class CloseApplication : ICloseApplication 
{ 
    public void closeApplication() 
    { 
     Application.Current.Exit(); 
    } 
} 

Zastosowanie w Xamarin Forms

var closer = DependencyService.Get<ICloseApplication>(); 
    closer?.closeApplication(); 
+0

Dziękujemy! Czytając inne wątki, powiedzieli: "nie można tego zrobić w iOS". Dobrze jest zobaczyć, że istnieje sposób. – Damian

+0

@Damian - Domyślam się, że Apple nie pozwoli na to, ponieważ jest to niezgodne z konwencją, a w aplikacjach na iOS, natywnych aplikacjach, monitorach Apple, że programiści nie używają żadnych prywatnych api do zamknięcia aplikacji i nie jestem pewien czy sprawdziłeś czy generuje on dowolny dziennik awarii, tylko myśl –

+0

To działało dla Androida dla mnie, ale musiałem dodać [assembly: Dependency (typeof (CloseApplication))] do klasy CloseApplication, aby uzyskać usługę zależności –

1

prosty wszystko-w-jednym połączeniem poprzednich odpowiedzi zamiast interfejsem/zależnością

protected override bool OnBackButtonPressed() 
    { 
     Device.BeginInvokeOnMainThread(async() => 
     { 
      var result = await this.DisplayAlert("Alert!", "want to exit?", "Yes", "No"); 
      if (result) 
      { 
#if __ANDROID__ 
       var activity = (Android.App.Activity)Forms.Context; 
       activity.FinishAffinity(); 
#endif 
#if __IOS__ 
       Thread.CurrentThread.Abort(); 
#endif 
      } 
     }); 
     return true; 
    } 
Powiązane problemy