【问题标题】:Xamarin close Android application on back buttonXamarin 在后退按钮上关闭 Android 应用程序
【发布时间】:2020-04-02 00:12:49
【问题描述】:

我尝试了 3 种不同的方法

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
    System.Environment.Exit(0);

public override void OnBackPressed()
{
    Finish();
}

public override bool OnKeyDown(Keycode keyCode, KeyEvent e)
{
    if (keyCode == Keycode.Back)
    {
            System.Environment.Exit(0);
            return true;
    }
    return base.OnKeyDown(keyCode, e);
}

上述方法似乎都不起作用

【问题讨论】:

  • 老问题,而且可能很愚蠢,public override void OnBackPressed 应该在您当前所在的 Activity 上,而不仅仅是在 MainActivity
  • @RosdiKasim 为什么我会有 2 个活动?我只有 1 个

标签: c# android xamarin


【解决方案1】:

按下物理后退按钮时,您可以使用DepedencyService for closing an app

在您的 UI (PCL) 中,执行以下操作:

protected override bool OnBackButtonPressed()
{
   if (Device.RuntimePlatform == Device.Android)
       DependencyService.Get<IAndroidMethods>().CloseApp();

   return base.OnBackButtonPressed();
}

同时创建一个接口(在您的 UI PCL 中):

public interface IAndroidMethods
{
    void CloseApp();
}

现在在您的 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());
       }
   }
}

【讨论】:

  • 我需要在哪个文件中编写Android特定的逻辑??
  • @TarunSeera 只需在您的 Android 项目中创建一个新文件。在类中声明assembly 属性以确保在DependencyService (read more here) 中注册Android 特定的逻辑。这实质上意味着您可以将文件放置在 Android 项目中的任何位置。 DependencyService 将负责其余的工作。
  • 您能否建议如何在 Button (Xamarin Forms) 中使文本左对齐
  • Process.KillProcess(Process.MyPid());请更新语法
【解决方案2】:

如果您想退出应用程序而不杀死并返回主屏幕,那么如果您想从关闭位置恢复它。您可以在相关活动中执行以下操作。

  public override void OnBackPressed()
    {
        Intent startMain = new Intent(Intent.ActionMain);
        startMain.AddCategory(Intent.CategoryHome);
        startMain.SetFlags(ActivityFlags.NewTask);
        StartActivity(startMain);

    }

希望这会有所帮助。

【讨论】:

  • 很好的解决方案。你能解释更多吗?
【解决方案3】:

我试过这段代码,它在我身边有效。希望这段代码对您有所帮助。

protected override bool OnBackButtonPressed()
    {
        Device.BeginInvokeOnMainThread(async () =>
        {
            var result = await DisplayAlert("Alert!", "Do you really want to exit the application?", "Yes", "No");
            if (result)
            {
                if (Device.OS == TargetPlatform.Android)
                {
                    Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
                }
            }
        });
        return true;
    }

【讨论】:

  • TargetPlatform 已过时.... 使用:if (Device.RuntimePlatform == Device.Android)
【解决方案4】:

试试这个解决方案:

protected override bool OnBackButtonPressed()
{           
    Device.BeginInvokeOnMainThread(async () => 
    {
        var res = await this.DisplayAlert("Do you really want to exit the application?", "","Yes", "No").ConfigureAwait(false);

        if (res) System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow();
    });           
    return true;
}

【讨论】:

    【解决方案5】:
    public override void OnBackPressed()
    {
        Finish();
        Android.OS.Process.KillProcess (Android.OS.Process.MyPid ());
    }
    

    【讨论】:

    • OnBackPressed() 根本不会触发我
    • 你把 OnBackPressed() 放在 mainActivity 里了吗?
    • @IdoT 我当然有。没有别的地方可以放
    【解决方案6】:

    在你的活动中试试这个:

    this.FinishAffinity();
    

    祝你好运!

    【讨论】:

    • 这应该在评论中
    【解决方案7】:
    Finish(); 
    

    为我工作。从主要活动执行。

    【讨论】:

      【解决方案8】:

      您也可以要求用户确认退出App:

      public override void OnBackPressed()
      {
          RunOnUiThread(
              async () =>
              {
                  var isCloseApp = await AlertAsync(this, "NameOfApp", "Do you want to close this app?", "Yes", "No");
      
                  if (isCloseApp)
                  {
                      var activity = (Activity)Forms.Context;
                      activity.FinishAffinity();
                  }
              });
      }
      
      public Task<bool> AlertAsync(Context context, string title, string message, string positiveButton, string negativeButton)
      {
          var tcs = new TaskCompletionSource<bool>();
      
          using (var db = new AlertDialog.Builder(context))
          {
              db.SetTitle(title);
              db.SetMessage(message);
              db.SetPositiveButton(positiveButton, (sender, args) => { tcs.TrySetResult(true); });
              db.SetNegativeButton(negativeButton, (sender, args) => { tcs.TrySetResult(false); });
              db.Show();
          }
      
          return tcs.Task;
      }
      

      Xamarin.Android await AlertDialog.Builder

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多