2
0
mirror of https://github.com/godotengine/godot.git synced 2025-04-25 01:48:08 +08:00

Merge pull request from m4gr3d/delegate_restart_invokation_master

Delegate handling and implementation of the restart functionality to the Godot host
This commit is contained in:
Rémi Verschelde 2021-08-18 20:12:10 +02:00 committed by GitHub
commit a619a92e3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 16 deletions
platform/android/java/lib/src/org/godotengine/godot

@ -30,6 +30,7 @@
package org.godotengine.godot;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
@ -85,6 +86,26 @@ public abstract class FullScreenGodotApp extends FragmentActivity implements God
}
}
@Override
public final void onGodotRestartRequested(Godot instance) {
if (instance == godotFragment) {
// HACK:
//
// Currently it's very hard to properly deinitialize Godot on Android to restart the game
// from scratch. Therefore, we need to kill the whole app process and relaunch it.
//
// Restarting only the activity, wouldn't be enough unless it did proper cleanup (including
// releasing and reloading native libs or resetting their state somehow and clearing statics).
//
// Using instrumentation is a way of making the whole app process restart, because Android
// will kill any process of the same package which was already running.
//
Bundle args = new Bundle();
args.putParcelable("intent", getIntent());
startInstrumentation(new ComponentName(this, GodotInstrumentation.class), null, args);
}
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);

@ -331,22 +331,8 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
}
public void restart() {
// HACK:
//
// Currently it's very hard to properly deinitialize Godot on Android to restart the game
// from scratch. Therefore, we need to kill the whole app process and relaunch it.
//
// Restarting only the activity, wouldn't be enough unless it did proper cleanup (including
// releasing and reloading native libs or resetting their state somehow and clearing statics).
//
// Using instrumentation is a way of making the whole app process restart, because Android
// will kill any process of the same package which was already running.
//
final Activity activity = getActivity();
if (activity != null) {
Bundle args = new Bundle();
args.putParcelable("intent", mCurrentIntent);
activity.startInstrumentation(new ComponentName(activity, GodotInstrumentation.class), null, args);
if (godotHost != null) {
godotHost.onGodotRestartRequested(this);
}
}

@ -58,4 +58,10 @@ public interface GodotHost {
* Invoked on the UI thread as the last step of the Godot instance clean up phase.
*/
default void onGodotForceQuit(Godot instance) {}
/**
* Invoked on the GL thread when the Godot instance wants to be restarted. It's up to the host
* to perform the appropriate action(s).
*/
default void onGodotRestartRequested(Godot instance) {}
}