私のプロジェクトは、マスター/詳細ナビゲーションで構築されています。リストには、Resources、Contacts、および Login という名前の合計 3 つのページがあります。iOS ではすべて正常に動作しますが、ユーザーが Droid/WinPhone デバイスのハードウェアの戻るボタンを押すと、アプリは終了するはずです。すべてのデバイスで動作する Xamarin Forms のアプリ終了メカニズムはありますか? (プラットフォームに依存しないネイティブ コードを意味します) よろしくお願いします。
5 に答える
この通りにしました
xamarin フォームにインターフェイスを追加しました
public interface INativeHelper
{
void CloseApp();
}
Androidプロジェクトでは、INativeHelperの実装を行いました
public class NativeHelper : INativeHelper
{
public void CloseApp()
{
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
}
}
IOS での INativeHelper の実装
public class NativeHelper : INativeHelper
{
public void CloseApp()
{
Process.GetCurrentProcess().CloseMainWindow();
Process.GetCurrentProcess().Close();
}
}
次に、Xamarin.Forms プロジェクトのページでメソッド OnBackButtonPressed をオーバーライドするだけです
protected override bool OnBackButtonPressed()
{
INativeHelper nativeHelper = null;
nativeHelper = DependencyService.Get<INativeHelper>();
if (nativeHelper != null)
{
nativeHelper.CloseApp();
}
return base.OnBackButtonPressed();
}
WinPhone 向けの実装はしていませんが、同様のはずです。
物理的な戻るボタンが押されたときにアプリを閉じるために DepedencyService を使用できます。
UI (PCL) で、次の操作を行います。
protected override bool OnBackButtonPressed()
{
if (Device.OS == TargetPlatform.Android)
DependencyService.Get<IAndroidMethods>().CloseApp();
return base.OnBackButtonPressed();
}
次に、Android プロジェクトに Android 固有のロジックを実装します。
[assembly: Xamarin.Forms.Dependency(typeof(AndroidMethods))]
namespace Your.Namespace
{
public class AndroidMethods : IAndroidMethods
{
public void CloseApp()
{
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
}
}
}
インターフェイスも作成します (UI PCL 内)。
public interface IAndroidMethods
{
void CloseApp();
}
私の知る限り、Xamarin アプリケーションでアプリを終了するネイティブな方法はありません。
唯一の方法は、依存サービスを使用することです。ContentPage で OnBackButtonPressed 関数をオーバーライドし、それが最後のページであることを確認します。
protected override bool OnBackButtonPressed()
{
if(navigation.NavigationStack.Count == 1)//navigation is MainPage.Navigation
DependencyService.Get<YourDependencyInterface>().CloseApp();
}
YourAndroidDependencyクラスのAndroidの場合:
public void CloseApp()
{
(Xamarin.Forms.Forms.Context as Activity).Finish();
}
WinPhoneについてはわかりませんが、依存関係サービスと同じ方法で実行できると思います。