startActivity(): implement Intent.FLAG_ACTIVITY_CLEAR_TOP

This commit is contained in:
Julian Winkler
2025-07-25 16:41:59 +02:00
parent 9e27cccc0d
commit a9f68c976b
7 changed files with 50 additions and 2 deletions

View File

@@ -151,6 +151,9 @@ static jobject activity_not_created = NULL;
void activity_start(JNIEnv *env, jobject activity_object) void activity_start(JNIEnv *env, jobject activity_object)
{ {
if (activity_current)
activity_unfocus(env, activity_current);
activity_current = NULL;
/* -- run the activity's onCreate -- */ /* -- run the activity's onCreate -- */
(*env)->CallVoidMethod(env, activity_object, handle_cache.activity.onCreate, NULL); (*env)->CallVoidMethod(env, activity_object, handle_cache.activity.onCreate, NULL);
if((*env)->ExceptionCheck(env)) if((*env)->ExceptionCheck(env))
@@ -198,6 +201,35 @@ JNIEXPORT void JNICALL Java_android_app_Activity_nativeStartActivity(JNIEnv *env
activity_start(env, activity); activity_start(env, activity);
} }
JNIEXPORT void JNICALL Java_android_app_Activity_nativeResumeActivity(JNIEnv *env, jclass class, jclass activity_class, jobject intent)
{
GList *l;
GList *activities_to_close = NULL;
for (l = activity_backlog; l != NULL; l = l->next) {
if ((*env)->IsSameObject(env, activity_class, _CLASS(l->data))) {
if (l != activity_backlog) {
activities_to_close = activity_backlog;
activity_backlog = l;
l->prev->next = NULL;
l->prev = NULL;
}
/* -- run the activity's onNewIntent -- */
(*env)->CallVoidMethod(env, l->data, handle_cache.activity.onNewIntent, intent);
if((*env)->ExceptionCheck(env))
(*env)->ExceptionDescribe(env);
break;
}
}
activity_update_current(env);
for (l = activities_to_close; l != NULL; l = l->next) {
activity_close(env, l->data);
_UNREF(l->data);
}
g_list_free(activities_to_close);
}
JNIEXPORT void JNICALL Java_android_app_Activity_nativeOpenURI(JNIEnv *env, jclass class, jstring uriString) JNIEXPORT void JNICALL Java_android_app_Activity_nativeOpenURI(JNIEnv *env, jclass class, jstring uriString)
{ {
static XdpPortal *portal = NULL; static XdpPortal *portal = NULL;

View File

@@ -29,6 +29,14 @@ JNIEXPORT void JNICALL Java_android_app_Activity_nativeFinish
JNIEXPORT void JNICALL Java_android_app_Activity_nativeStartActivity JNIEXPORT void JNICALL Java_android_app_Activity_nativeStartActivity
(JNIEnv *, jclass, jobject); (JNIEnv *, jclass, jobject);
/*
* Class: android_app_Activity
* Method: nativeResumeActivity
* Signature: (Ljava/lang/Class;Landroid/content/Intent;)V
*/
JNIEXPORT void JNICALL Java_android_app_Activity_nativeResumeActivity
(JNIEnv *, jclass, jclass, jobject);
/* /*
* Class: android_app_Activity * Class: android_app_Activity
* Method: nativeOpenURI * Method: nativeOpenURI

View File

@@ -17,6 +17,7 @@ void set_up_handle_cache(JNIEnv *env)
handle_cache.activity.onStop = _METHOD(handle_cache.activity.class, "onStop", "()V"); handle_cache.activity.onStop = _METHOD(handle_cache.activity.class, "onStop", "()V");
handle_cache.activity.onPause = _METHOD(handle_cache.activity.class, "onPause", "()V"); handle_cache.activity.onPause = _METHOD(handle_cache.activity.class, "onPause", "()V");
handle_cache.activity.onBackPressed = _METHOD(handle_cache.activity.class, "onBackPressed", "()V"); handle_cache.activity.onBackPressed = _METHOD(handle_cache.activity.class, "onBackPressed", "()V");
handle_cache.activity.onNewIntent = _METHOD(handle_cache.activity.class, "onNewIntent", "(Landroid/content/Intent;)V");
handle_cache.attribute_set.class = _REF((*env)->FindClass(env, "android/util/AttributeSet")); handle_cache.attribute_set.class = _REF((*env)->FindClass(env, "android/util/AttributeSet"));
if((*env)->ExceptionCheck(env)) if((*env)->ExceptionCheck(env))

View File

@@ -13,6 +13,7 @@ struct handle_cache {
jmethodID onStop; jmethodID onStop;
jmethodID onPause; jmethodID onPause;
jmethodID onBackPressed; jmethodID onBackPressed;
jmethodID onNewIntent;
} activity; } activity;
struct { struct {
jclass class; jclass class;

View File

@@ -586,6 +586,7 @@ public class Activity extends ContextThemeWrapper implements Window.Callback, La
private native void nativeFinish(long native_window); private native void nativeFinish(long native_window);
public static native void nativeStartActivity(Activity activity); public static native void nativeStartActivity(Activity activity);
public static native void nativeResumeActivity(Class<? extends Activity> activityClass, Intent intent);
public static native void nativeOpenURI(String uri); public static native void nativeOpenURI(String uri);
public native void nativeFileChooser(int action, String type, String title, int requestCode); public native void nativeFileChooser(int action, String type, String title, int requestCode);
public void reportFullyDrawn() {} public void reportFullyDrawn() {}

View File

@@ -622,8 +622,12 @@ public class Context extends Object {
@Override @Override
public void run() { public void run() {
try { try {
if ((intent_.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 && intent_.getComponent() != null) {
Activity.nativeResumeActivity(Class.forName(intent_.getComponent().getClassName()).asSubclass(Activity.class), intent_);
} else {
Activity activity = Activity.internalCreateActivity(className_, this_application.native_window, intent_); Activity activity = Activity.internalCreateActivity(className_, this_application.native_window, intent_);
Activity.nativeStartActivity(activity); Activity.nativeStartActivity(activity);
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -17,6 +17,7 @@ import java.util.Set;
public class Intent implements Parcelable { public class Intent implements Parcelable {
public static final String ACTION_MAIN = "android.intent.action.MAIN"; public static final String ACTION_MAIN = "android.intent.action.MAIN";
public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000; public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
public static final int FLAG_ACTIVITY_CLEAR_TOP = 0x04000000;
private ComponentName component; private ComponentName component;
private Bundle extras = new Bundle(); private Bundle extras = new Bundle();