添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
八块腹肌的遥控器  ·  Elastic:配置 ...·  2 年前    · 

Unity OnApplicationQuit()在安卓系统中一直不工作

2 人关注

Android的设计方式是: OnApplicationPause 对应于活动的onPause/onResume事件。 OnApplicationQuit 对应于活动生命周期的onDestroy事件。

根据android文档,你可以保证得到对onPause的回调,但它之后的东西可能不会被调用。因此,如果Android在onPause(Pre Honeycomb)或onStop之后破坏了活动,你可能不会得到OnApplicationQuit的调用。

有什么办法能让我在所有设备和所有安卓版本上工作的Unity上检查应用程序是否被退出?

android
unity3d
Sameer Hussain
Sameer Hussain
发布于 2020-09-30
3 个回答
Tomasz Juszczak
Tomasz Juszczak
发布于 2022-06-18
已采纳
0 人赞同

你需要表现得像OnPause会关闭应用程序一样! 在Android上等待OnApplicationQuit将不会让你采取相应的行动。把OnPause和OnApplicationQuit这两个方法都附加为Quit或者像下面的例子那样行动。

如果你正在制作一个单人游戏 - 保存所有的游戏内容,以防万一。如果活动会恢复就好,如果不恢复你就有备份。

如果你正在制作一个多人游戏 - 勾选 "在后台运行 "会让你在应用程序暂停时保持连接,但用户可以随时杀死你的应用程序。我会做一个循环程序并等待(大约30秒),然后杀死连接。如果你不打算让它在后台运行,就直接杀死连接。

引用安卓开发者关于 onDestroy() 如果暂停了,则映射到OnApplicationQuit。

onDestroy

在一个活动被销毁之前执行任何最后的清理工作。 这可能是因为该活动正在结束(有人对它调用了 finish() 对它调用 finish() ,或者因为系统暂时 销毁该活动的实例以节省空间。你可以 isFinishing() 方法来区分这两种情况。

Note : 不要指望这个方法被调用作为保存 数据 !例如,如果一个活动正在编辑一个内容提供者中的数据 提供者。 这些编辑应该在onPause()或 onSaveInstanceState(Bundle)中提交。 ,而不是在这里。这个方法通常是 来释放与一个活动相关联的线程等资源,这样被破坏的活动就不会留下这些资源。 活动相关联的资源,这样被破坏的活动就不会在其应用程序的其它部分仍在运行时留下这些东西 周围,而它的应用程序的其它部分仍然在运行。T 这里有 的情况下,系统将简单地杀死该活动的托管 进程,而不调用其中的这个方法(或任何其他方法)。 ,所以它 不应该被用来做那些打算在进程结束后仍然存在的事情。 进程结束后仍然存在的事情。

Cardstdani
Cardstdani
发布于 2022-06-18
0 人赞同

你可以使用 应用程序.退出 事件来检查应用程序是否正在退出。

    static Example(){
        Application.quitting += Quit;
    static void Quit(){
        Debug.Log("Quitting the Application");

或者你可以使用在应用程序退出时(OnApplicationQuit)。方法,以这种方式。

    bool isApplicationQuitting = false;
    void OnApplicationQuit() {
        isApplicationQuitting = true;
    
This does not solve the issue he mentioned in the question Therefore, you may not get a call to OnApplicationQuit if Android destroys the activity after onPause
Alireza Jamali
Alireza Jamali
发布于 2022-06-18
0 人赞同

替换代码0】在你明确调用Application.Quit()时被调用,这通常是由后退按钮或退出对话框完成的。

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

替换代码0】当用户按下主屏幕按钮或任务列表按钮并关闭你的游戏后,手机电池耗尽或游戏崩溃时,将不会被调用,以上都不是。

要在用户退出时做任何操作,我建议实现OnFocusOnPause,当用户在安卓系统上按下主屏幕按钮或任务列表时就会发生。 记住,如果用户做了任务列表并立即关闭你的游戏,任何写入磁盘的操作都会停止,并导致未完成和损坏的保存文件。你可以通过在写操作期间为你的保存文件指定一个临时名称来防止这种情况,当它完成后,用保存文件替换临时文件。一个额外的磁盘操作,但也是一个失败的保险,或者将你的保存文件归类为小于10kb的数据块,通过这样做,无论用户从任务列表按钮到关闭所有按钮有多快,都有足够的时间将10kb写入磁盘。

另一个替代方法是使用this

或者在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);