调用unity的Application.Quit();方法退出会导致重启问题

最近测试提了一个bug,游戏退出会导致游戏重启
我发现我们是直接调用的unity自带的方法: Application.Quit();
但是我使用demo工程,调用这个是正常的,摸不着头脑

尝试使用安卓方法:

using (AndroidJavaClass systemClass = new AndroidJavaClass("java.lang.System"))
{
    systemClass.CallStatic("exit", 0);
}
using (AndroidJavaClass process = new AndroidJavaClass("android.os.Process")
{
	int mypid = process.CallStatic<int>("myPid");
	process.CallStatic("killProcess", mypid);
}
// 使用AndroidJavaClass找到UnityPlayer类

using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
    using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
    {
        // 获取ActivityManager
        AndroidJavaObject mActivityManager = currentActivity.Call<AndroidJavaObject>("getSystemService", "activity");
       	// 获取RunningAppProcessInfo列表
        AndroidJavaObject mList = mActivityManager.Call<AndroidJavaObject>("getRunningAppProcesses");
        AndroidJavaClass process = new AndroidJavaClass("android.os.Process");
        int mypid = process.CallStatic<int>("myPid");
        // 遍历列表并杀掉非当前进程的进程
        for (int i = 0; i < mList.Call<int>("size"); i++)
        {
            AndroidJavaObject runningAppProcessInfo = mList.Call<AndroidJavaObject>("get", i);
            if (runningAppProcessInfo.Get<int>("pid") != mypid)
            {
                process.CallStatic("killProcess", runningAppProcessInfo.Get<int>("pid"));
            }
        }
        // 最后杀掉当前进程
        process.CallStatic("killProcess", mypid);
        // 立即退出应用
        System.Environment.Exit(0);
    }
}

或者移动到后台,再杀掉进程:

AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
activity.Call<bool>("moveTaskToBack", true);
AndroidJavaClass processClass = new AndroidJavaClass("android.os.Process");
int pid = processClass.CallStatic<int>("myPid");
processClass.CallStatic("killProcess", pid);

以上方法在demo都可以使用并成功退出,但是在项目上就是不行。。。,然后我就找到大佬的指引了:
https://cloud.tencent.com/developer/article/2248532

如果当前进程处于前台 , 杀死该进程后 , Android 系统会重启该进程 , 这是 Android 系统本身的机制 ;

activity.finishAffinity();

上述代码可以关闭所有的本任务栈内的 Activity 窗口界面 , 自然就可以杀死本进程 ; 如果想要杀得更彻底 , 使用该方法与上面的两种杀进程的方法结合使用 ;
杀死前台进程 , 将所有的 Activity 关闭 , 然后调用 android.os.Process.killProcess(android.os.Process.myPid()) 或 java.lang.System.exit(0) 中的一种方法即可 ;

重点加粗:

关闭 Activity 建议使用 Activity 类的 finishAffinity() 方法 , 该方法可以关闭当前前台任务栈中的所有 Activity , 之后再调用上述两个杀进程的方法 , 即可成功关闭进程 , 应用不会重启 ;

然后:

#if UNITY_ANDROID && !UNITY_EDITOR
            // 使用AndroidJavaClass找到UnityPlayer类
            try
            {
                using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    using (AndroidJavaClass systemClass = new AndroidJavaClass("java.lang.System"))
                    {
                        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
                        currentActivity.Call("finishAffinity");
                        systemClass.CallStatic("exit", 0);
                    }
                }
            }
            catch (Exception ex)
            {
                if (ex != null)
                {
                    Debug.LogWarning("QuitGame: " + ex);
                }
                Application.Quit();
            }
#else
            Debug.LogWarning("退出游戏,Application.Quit() 2");
            Application.Quit();
#endif

终于可以正常退出游戏不重启了QAQ

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值