最近测试提了一个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")){// 获取ActivityManagerAndroidJavaObject 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();}
#elseDebug.LogWarning("退出游戏,Application.Quit() 2");Application.Quit();
#endif
终于可以正常退出游戏不重启了QAQ