大家經常都在詢問這樣的問題:
如何在 Xamarin.Forms 中執行結束應用程式的功能
了解更多關於 [Xamarin.Android] 的使用方式
了解更多關於 [Xamarin.iOS] 的使用方式
了解更多關於 [Xamarin.Forms] 的使用方式
了解更多關於 [Hello, Android:快速入門] 的使用方式
了解更多關於 [Hello, iOS – 快速入門] 的使用方式
了解更多關於 [Xamarin.Forms 快速入門] 的使用方式
我個人認為,這個問題,不是技術上的問題,而是問問題的人,需要對於您開發的應用程式所在的平台上,了解這個平台提供的應用程式生命週期;一旦你對於 iOS & Android 平台的應用程式生命週期有了解之後,這個問題也就解決了;喔,你們沒有聽錯,可是,我們有看到任何的技術方法呀,可否告訴我究竟要呼叫甚麼 API 才能夠結束應用程式的執行嗎?
這個答案是很明確的,在行動裝置作業系統中,iOS / Android ,想要結束您開發的應用程式執行,在各自的應用程式生命週期中,只有兩個方法,一個就是當作業系統資源不足夠的時候,作業系統有權將任何應用程式立即結束執行;另外一個就是使用者可以透過手勢或者作業系統提供的操作介面,手動的結束特定應用程式的執行。
從應用程式的生命週期,每個應用程式是沒有透過 App 結束執行這件事情,只有在前景執行或者移到背景去等候再度回到前景來執行。所以,請不要逢人就詢問
如何在 Xamarin.Forms 中執行結束應用程式的功能
,這不是 Xamarin.Forms 也不是 Xamarin 可以做到的事情,原則上,只要作業系統有提供這樣的 API,你就可以在 Xamarin.Forms 呼叫他來使用。
在這篇文章中 How do I programmatically quit my iOS application?,你會看到蘋果官方的回覆:
There is no API provided for gracefully terminating an iOS application.
。對於不死心的人,還是想要這麼做,那麼,請自行觀看蘋果相關的上架說明文件(不要沒看文件就到處用您的智慧來想像該怎麼做),強制這麼做的話,是無法上架App到公開的 App Store 市集上。
好的,若您還是堅持要這麼做,我們來看看在 Xamarin.Form 的開發環境中,該如何做到這樣的需求,在這裡,我們設計一個按鈕,當使用者點選這個按鈕之後,就會 ViewModel 內,執行一個注入原生平台的物件,執行結束應用程式的功能。
建立一個結束應用程式的介面
首先,我們在 Xamarin.Forms 專案內,建立一個介面,這個介面裡面只有定義一個方法
Exit()
,當使用者呼叫這個方法之後,就會結束這個應用程式的執行。 public interface IAppExit
{
void Exit();
}
測試頁面 View / ViewModel
我們的測試 App 很簡單,只有一個按鈕
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="XFExit.Views.MainPage"
Title="MainPage">
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="{Binding Title}" />
<Button
Text="結束應用程式"
Command="{Binding CloseAppCommand}"/>
</StackLayout>
</ContentPage>
當按下了
結束應用程式
按鈕之後,就會執行 ViewModel 內的 CloseAppCommand
DelegateCommand 物件方法。
在底下的測試範例 ViewModel 中,我們透過相依性服務注入技術,將
IAppExit
實作物件注入到 ViewModel 內,並且執行 _AppExit.Exit();
方法之後,就會結束應用程式的執行。 public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly INavigationService _navigationService;
public DelegateCommand CloseAppCommand { get; set; }
IAppExit _AppExit;
public MainPageViewModel(INavigationService navigationService, IAppExit appExit)
{
_navigationService = navigationService;
_AppExit = appExit;
CloseAppCommand = new DelegateCommand(() =>
{
_AppExit.Exit();
});
}
public void OnNavigatedFrom(NavigationParameters parameters)
{
}
public void OnNavigatingTo(NavigationParameters parameters)
{
}
public void OnNavigatedTo(NavigationParameters parameters)
{
}
}
Android 平台實作 IAppExit
現在,我們需要在 Android 專案內,建立一個類別 AppExit,這個類別需要實作
IAppExit
介面的方法,我們在 Exit() 這個方法中,呼叫 Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
,這樣,當這個 Android 平台的 Xamarin.Forms 專案執行的時候,就會結束這個應用程式的執行。[assembly: Xamarin.Forms.Dependency(typeof(AppExit))]
namespace XFExit.Droid.Servoces
{
class AppExit : IAppExit
{
public void Exit()
{
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
}
}
}
iOS 平台實作 IAppExit
現在,我們需要在 iOS 專案內,建立一個類別 AppExit,這個類別需要實作
IAppExit
介面的方法,我們在 Exit() 這個方法中,呼叫 System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow();
,這樣,當這個 iOS 平台的 Xamarin.Forms 專案執行的時候,就會結束這個應用程式的執行。
當然,你也可以執行 .NET 平台的中止執行續的方法:
Thread.CurrentThread.Abort();
這樣,也會結束這個應用程式的執行。[assembly: Xamarin.Forms.Dependency(typeof(AppExit))]
namespace XFExit.iOS.Services
{
public class AppExit : IAppExit
{
public void Exit()
{
System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow();
//Thread.CurrentThread.Abort();
}
}
}