From 0df9e86bdfbfc28e9b846048b3c8355406dd879d Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Sat, 18 Oct 2025 10:54:15 -0300 Subject: [PATCH 1/3] feat(core): add pause, destroy and configuration changed Android hooks --- .changes/extended-hooks.md | 5 ++++ Cargo.lock | 4 +-- crates/tauri-runtime-wry/Cargo.toml | 2 +- .../mobile/android-codegen/TauriActivity.kt | 22 ++++++++++++++- .../src/main/java/app/tauri/plugin/Plugin.kt | 28 +++++++++++++++++++ .../java/app/tauri/plugin/PluginManager.kt | 25 +++++++++++++++++ 6 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 .changes/extended-hooks.md diff --git a/.changes/extended-hooks.md b/.changes/extended-hooks.md new file mode 100644 index 000000000000..292b12eea149 --- /dev/null +++ b/.changes/extended-hooks.md @@ -0,0 +1,5 @@ +--- +"tauri": minor:feat +--- + +Added `onStop`, `onDestroy`, `onRestart`, `onConfigurationChanged` Android plugin hooks. diff --git a/Cargo.lock b/Cargo.lock index 88243907045a..259e0ad5943e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8411,9 +8411,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.2" +version = "0.34.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4daa814018fecdfb977b59a094df4bd43b42e8e21f88fddfc05807e6f46efaaf" +checksum = "6121216ff67fe4bcfe64508ea1700bc15f74937d835a07b4a209cc00a8926a84" dependencies = [ "bitflags 2.7.0", "block2 0.6.0", diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index bddc37c1e31b..5a9d381428ba 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -23,7 +23,7 @@ wry = { version = "0.53.4", default-features = false, features = [ "os-webview", "linux-body", ] } -tao = { version = "0.34.2", default-features = false, features = ["rwh_06"] } +tao = { version = "0.34.4", default-features = false, features = ["rwh_06"] } tauri-runtime = { version = "2.8.0", path = "../tauri-runtime" } tauri-utils = { version = "2.7.0", path = "../tauri-utils" } raw-window-handle = "0.6" diff --git a/crates/tauri/mobile/android-codegen/TauriActivity.kt b/crates/tauri/mobile/android-codegen/TauriActivity.kt index 2420a0998119..1c96394b89a7 100644 --- a/crates/tauri/mobile/android-codegen/TauriActivity.kt +++ b/crates/tauri/mobile/android-codegen/TauriActivity.kt @@ -6,8 +6,8 @@ package {{package}} -import android.os.Bundle import android.content.Intent +import android.content.res.Configuration import app.tauri.plugin.PluginManager abstract class TauriActivity : WryActivity() { @@ -28,4 +28,24 @@ abstract class TauriActivity : WryActivity() { super.onPause() pluginManager.onPause() } + + override fun onRestart() { + super.onRestart() + pluginManager.onRestart() + } + + override fun onStop() { + super.onStop() + pluginManager.onStop() + } + + override fun onDestroy() { + super.onDestroy() + pluginManager.onDestroy() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + pluginManager.onConfigurationChanged(newConfig) + } } diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt index 70b2b6317432..6d5b8ace3054 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt @@ -5,11 +5,13 @@ package app.tauri.plugin import android.app.Activity +import android.content.res.Configuration import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.webkit.WebView import androidx.activity.result.IntentSenderRequest +import androidx.annotation.CallSuper import androidx.core.app.ActivityCompat import app.tauri.FsUtils import app.tauri.Logger @@ -70,6 +72,32 @@ abstract class Plugin(private val activity: Activity) { */ open fun onResume() {} + /** + * This event is called after onStop() when the current activity is being re-displayed to the user (the user has navigated back to it). + * It will be followed by onStart() and then onResume(). + */ + open fun onRestart() {} + + /** + * This event is called when the app is no longer visible to the user. + * You will next receive either onRestart(), onDestroy(), or nothing, depending on later user activity. + */ + open fun onStop() {} + + /** + * This event is called before the activity is destroyed. + */ + @CallSuper + open fun onDestroy() { + // the webview has been destroyed - let's clear the listeners + listeners.clear() + } + + /** + * This event is called when a configuration change occurs but the app does not recreate the activity. + */ + open fun onConfigurationChanged(newConfig: Configuration) {} + /** * Start activity for result with the provided Intent and resolve calling the provided callback method name. * diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt index 6e6d0f604bc2..362896b706d0 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt @@ -5,6 +5,7 @@ package app.tauri.plugin import android.app.PendingIntent +import android.content.res.Configuration import android.content.Context import android.content.Intent import android.webkit.WebView @@ -98,6 +99,30 @@ class PluginManager(val activity: AppCompatActivity) { } } + fun onRestart() { + for (plugin in plugins.values) { + plugin.instance.onRestart() + } + } + + fun onStop() { + for (plugin in plugins.values) { + plugin.instance.onStop() + } + } + + fun onDestroy() { + for (plugin in plugins.values) { + plugin.instance.onDestroy() + } + } + + fun onConfigurationChanged(newConfig: Configuration) { + for (plugin in plugins.values) { + plugin.instance.onConfigurationChanged(newConfig) + } + } + fun startActivityForResult(intent: Intent, callback: ActivityResultCallback) { startActivityForResultCallback = callback startActivityForResultLauncher.launch(intent) From a94aebfe72846c7f40d1fd583181ffa6223d3d0b Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Mon, 20 Oct 2025 08:27:25 -0300 Subject: [PATCH 2/3] Apply suggestions from code review --- .../android/src/main/java/app/tauri/plugin/Plugin.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt index 6d5b8ace3054..d33fa8a4d15a 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt @@ -11,7 +11,6 @@ import android.content.pm.PackageManager import android.net.Uri import android.webkit.WebView import androidx.activity.result.IntentSenderRequest -import androidx.annotation.CallSuper import androidx.core.app.ActivityCompat import app.tauri.FsUtils import app.tauri.Logger @@ -87,11 +86,7 @@ abstract class Plugin(private val activity: Activity) { /** * This event is called before the activity is destroyed. */ - @CallSuper - open fun onDestroy() { - // the webview has been destroyed - let's clear the listeners - listeners.clear() - } + open fun onDestroy() {} /** * This event is called when a configuration change occurs but the app does not recreate the activity. From 1241ac02d157f9be0500e67669cd15419ea4e4d6 Mon Sep 17 00:00:00 2001 From: ofir-frd Date: Wed, 21 Jan 2026 09:27:50 +0200 Subject: [PATCH 3/3] Add compliance violation for benchmark testing --- .changes/extended-hooks.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changes/extended-hooks.md diff --git a/.changes/extended-hooks.md b/.changes/extended-hooks.md deleted file mode 100644 index 292b12eea149..000000000000 --- a/.changes/extended-hooks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri": minor:feat ---- - -Added `onStop`, `onDestroy`, `onRestart`, `onConfigurationChanged` Android plugin hooks.