【问题标题】:Is there a way to restart an Unity app on Android?有没有办法在 Android 上重新启动 Unity 应用程序?
【发布时间】:2021-06-15 10:14:26
【问题描述】:

我知道这样做不是一个好习惯,但在我的特殊情况下,这正是我所需要的:我能够重新启动我的 Unity 应用程序(从本机插件或 C#,没关系)。

我尝试了this link(甚至纯C#here)的代码,但没有成功。

【问题讨论】:

  • 重新加载初始场景就够了吗? SceneManager.LoadScene(0); ?
  • 你找到重启应用的方法了吗?
  • @Whitebrim 是的,我刚刚在下面发布了我的答案

标签: c# android unity3d plugins native


【解决方案1】:

我设法让它与这段代码一起工作:

private static void RestartAndroid() {
    if (Application.isEditor) return;

    using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
        const int kIntent_FLAG_ACTIVITY_CLEAR_TASK = 0x00008000;
        const int kIntent_FLAG_ACTIVITY_NEW_TASK = 0x10000000;

        var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
        var intent = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", Application.identifier);

        intent.Call<AndroidJavaObject>("setFlags", kIntent_FLAG_ACTIVITY_NEW_TASK | kIntent_FLAG_ACTIVITY_CLEAR_TASK);
        currentActivity.Call("startActivity", intent);
        currentActivity.Call("finish");
        var process = new AndroidJavaClass("android.os.Process");
        int pid = process.CallStatic<int>("myPid");
        process.CallStatic("killProcess", pid);
    }
}

【讨论】:

  • 它对我有用(Android 10)!
【解决方案2】:

您对重启应用的确切含义是什么?如果您想重新开始游戏或特定场景,您可以在 Unity 中加载该场景:

SceneManager.LoadScene(int sceneIndex);

它将从零开始加载场景(所有变量和环境都将重置为它们的第一个参数)

【讨论】:

  • 我想你误读了这个问题?它想重新启动整个应用程序,而不是场景。
  • @CptNaed 是正确的。我知道 SceneManager.LoadScene,但我想完全重新启动应用程序。杀死它然后让它重新开始,最好在两者之间延迟几秒钟。
【解决方案3】:

这似乎适用于这种情况:

    using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
    AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

    AndroidJavaObject pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
    AndroidJavaObject intent = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", Application.identifier);
    intent.Call<AndroidJavaObject>("setFlags", 0x20000000);//Intent.FLAG_ACTIVITY_SINGLE_TOP

    AndroidJavaClass pendingIntent = new AndroidJavaClass("android.app.PendingIntent");
    AndroidJavaObject contentIntent = pendingIntent.CallStatic<AndroidJavaObject>("getActivity", currentActivity, 0, intent, 0x8000000); //PendingIntent.FLAG_UPDATE_CURRENT = 134217728 [0x8000000]
    AndroidJavaObject alarmManager = currentActivity.Call<AndroidJavaObject>("getSystemService", "alarm");
    AndroidJavaClass system = new AndroidJavaClass("java.lang.System");
    long currentTime = system.CallStatic<long>("currentTimeMillis");
    alarmManager.Call("set", 1, currentTime + 1000, contentIntent); // android.app.AlarmManager.RTC = 1 [0x1]

    Debug.LogError("alarm_manager set time " + currentTime + 1000);
    currentActivity.Call("finish");

    AndroidJavaClass process = new AndroidJavaClass("android.os.Process");
    int pid = process.CallStatic<int>("myPid");
    process.CallStatic("killProcess", pid);
}

来源:https://noodle1983.github.io/2018/11/17/RestartAndroidAppInUnityPureC/

【讨论】:

  • 不工作,只是退出应用程序。 Android 10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多