2016-04-25 2 views
0

Я нашел некоторые вопросы/ответы о том, чтобы отслеживать, когда приложение переходит на задний план, как этот: Run code when Android app is closed/sent to backgroundAndroid с Xamarin - Как запустить код, когда пользователь закрывает приложение?

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

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

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

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

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

ответ

0

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

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

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

Есть comprehensive discussion about this in another question. Это о нативном коде, но объяснение проблемы очень полезно для вас понять пределы рамки.

1

Реализовать и зарегистрировать экземпляр 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()); 

     // ... 
    } 
}