Unity OnApplicationQuit() не работает на Android постоянно

#android #unity3d

#Android #unity3d

Вопрос:

Android был разработан таким образом, чтобы OnApplicationPause соответствовать событиям onPause / onResume действия. OnApplicationQuit соответствует событию onDestroy жизненного цикла activity.

Согласно документам Android, вы гарантированно получите обратный вызов для onPause, но все, что после него, может не быть вызвано. Поэтому вы можете не получить вызов OnApplicationQuit, если Android уничтожит действие после onPause (Pre Honeycomb) или onStop .

Есть идеи, как мне проверить, завершается ли приложение на Android на Unity, которое работает на всех устройствах и всех версиях Android

Ответ №1:

Вам нужно действовать так, как будто onPause закроет приложение!Ожидание OnApplicationQuit на Android не позволит вам действовать соответствующим образом. Прикрепите оба метода onPause и OnApplicationQuit как Quit или действуйте как примеры ниже:

Если вы создаете однопользовательскую игру — просто сохраните все содержимое игры на всякий случай. Если активность возобновится, все будет хорошо, если у вас нет резервной копии.

Если вы создаете многопользовательскую игру, проверка «Запуск в фоновом режиме» позволит вам поддерживать соединение, пока приложение приостановлено, но пользователь может отключить ваше приложение в любое время. Я бы сделал сопрограмму и подождал (около 30 секунд) и прервал соединение. Если вы не собираетесь заставлять его работать в фоновом режиме, просто отключите соединение.

Цитата от разработчиков Android о onDestroy(), которая отображается на OnApplicationQuit, если приостановлена

onDestroy

Выполните любую окончательную очистку перед уничтожением действия. Это может произойти либо потому, что действие завершается (кто-то вызвал finish() на нем), либо потому, что система временно уничтожает этот экземпляр действия для экономии места. Вы можете различать эти два сценария с помощью метода isFinishing() .

Примечание: не рассчитывайте на то, что этот метод вызывается как место для сохранения данных! Например, если действие редактирует данные в поставщике контента, эти изменения должны быть зафиксированы либо в onPause(), либо в onSaveInstanceState(Bundle) , но не здесь. Этот метод обычно реализуется для освобождения ресурсов, таких как потоки, которые связаны с действием, чтобы уничтоженное действие не оставляло таких вещей, пока остальная часть его приложения все еще работает. T здесь ситуации, когда система просто убьет процесс хостинга activity, не вызывая в нем этот метод (или любой другой), поэтому его не следует использовать для выполнения действий, которые должны оставаться после завершения процесса.

Ответ №2:

Вы можете использовать приложение.событие завершения, чтобы проверить, завершается ли работа приложения.

     static Example(){
        Application.quitting  = Quit;
    }

    static void Quit(){
        Debug.Log("Quitting the Application");
    }
  

Или вы можете использовать метод OnApplicationQuit() таким образом:

     bool isApplicationQuitting = false;
   
    void OnApplicationQuit() {
        isApplicationQuitting = true;
    }
  

Комментарии:

1. Это не решает проблему, о которой он упоминал в вопросе Therefore, you may not get a call to OnApplicationQuit if Android destroys the activity after onPause

Ответ №3:

OnApplicationQuit вызывается, когда вы явно вызываете Application.Quit(), что обычно выполняется либо кнопкой назад, либо диалогом выхода.

 void Update () 
{
    if (Input.GetKeyDown(KeyCode.Escape) 
    {
        Application.Quit();
    }
} 
  

OnApplicationQuit не будет вызываться, когда пользователь нажимает кнопку «Домой» или кнопку «Список задач» и закрывает игру после этого, разрядка аккумулятора телефона или сбой игры. ничего из вышеперечисленного.

Чтобы выполнить любую операцию при выходе пользователя, я рекомендую реализовать OnFocus or OnPause , который происходит, когда пользователь нажимает кнопку home или список задач на Android. помните, что если пользователь выполняет список задач и немедленно закрывает вашу игру, любая операция записи на диск остановится и приведет к незавершенному и поврежденному файлу сохранения. и в следующий раз, когда вы загружаете этот файл, он не может прочитать поток и выдает исключение. вы можете предотвратить это, указав временное имя для вашего файла сохранения во время операции записи, а когда она будет завершена, замените временный файл файлом сохранения. дополнительная операция с диском, но отказоустойчивая, или классифицируйте ваш файл сохранения на фрагменты данных размером менее 10 КБ, делая это независимо от того, как быстро пользователь переходит от кнопки списка задач к кнопке закрыть все, было достаточно времени для записи 10 КБ на диск.

другой альтернативой этому является создание службы с использованием этого

или создайте другое действие рядом с действием unity и задайте для него имя процесса в AndroidManifest.xml

https://answers.unity.com/questions/780406/androidunity-launching-activity-from-unity-activit.html

 void StartPackage(string package){    
          AndroidJavaClass activityClass;
         AndroidJavaObject activity, packageManager;
          AndroidJavaObject launch;
          
         
          activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
          activity = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
          packageManager = activity.Call<AndroidJavaObject>("getPackageManager");
          launch = packageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage",package);
          activity.Call("startActivity",launch);
     }
  

и в AndroidManifest.xml

 <activity
   android:name=".YourActivity"
   android:process=".YourActivity" />