Android с Xamarin - Как запустить код, когда пользователь закрывает приложение?

Я нашел несколько вопросов / ответов о том, как отслеживать, когда приложение переходит в фоновый режим, например: Запуск кода, когда приложение Android закрыто / отправлено в фоновый режим.

Но мне нужно запускать код, только если пользователь на самом деле закрывает приложение.

В качестве примера:

  1. Пользователь нажимает кнопку Обзор;
  2. Android открывает список миниатюрных изображений последних приложений;
  3. Пользователь проведет пальцем по эскизу моего приложения, чтобы удалить его (здесь я должен выполнить код).

Я пытался добавить код в OnDestroy() метод, но он, кажется, не вызывается, когда я делаю шаги выше. Я знаю, что код работает, потому что я сделал тест, где я называю Finish() в самом начале моего OnCreate()тогда OnDestroy() называется и так мой код.

Я использую Xamarin и MvvmCross, но Java-код тоже приветствуется.

2 ответа

Внедрить и зарегистрировать экземпляр Android.Content.IComponentCallbacks2 и слушать TrimMemory.UiHidden События:

LifecycleCallbacks:

public class LifecycleCallbacks : Java.Lang.Object, Android.Content.IComponentCallbacks2
{
    public void OnTrimMemory(TrimMemory level)
    {
        if (level == TrimMemory.UiHidden)
        {
            Console.WriteLine("Backgrounded...");
        }

    }

    public void OnConfigurationChanged(Configuration newConfig)
    {
    }

    public void OnLowMemory()
    {
    }
}

Регистрация экземпляра LifecycleCallbacks:

[Activity (Label = "MyApp", MainLauncher = true)]
public class MainActivity : Activity
{
    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);

        // ...

        Application.RegisterComponentCallbacks(new LifecycleCallbacks());

        // ...
    }
}

Родной разработчик Android здесь, я не уверен, что Xamarin расширяет родной фреймворк, делая это возможным, но изначально он в настоящее время не поддерживается.

ОС не обязательно называет деятельность onDestroy метод, когда приложение убито, но когда активность убита. Это действительно отличается, потому что приложение может быть убито без вызова деятельности " onDestroy и onDestroy можно вызвать без уничтожения приложения.

Я рекомендую обратиться к службам и диспетчеру аварийных сигналов, чтобы фактически отслеживать, когда это происходит, в сочетании с onDestroy а также onPause методы. Точность в этом случае будет так хороша, как вы хотите. Вы можете вызывать сигнал тревоги каждую минуту, например, чтобы проверить его, или запустить фоновую службу в своем собственном процессе, который останется активным после закрытия приложения.

Об этом есть всесторонняя дискуссия в другом вопросе. Речь идет о нативном коде, но объяснение проблемы очень полезно для понимания границ фреймворка.

Другие вопросы по тегам