use engine caching

This commit is contained in:
Fabian Freund
2025-05-05 14:28:57 +02:00
parent fd34a84d68
commit 213a239a4d
3 changed files with 60 additions and 1 deletions
+2 -1
View File
@@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
@@ -50,7 +51,7 @@
<application
android:label="Lensai"
android:name="${applicationName}"
android:name=".MyApplication"
android:icon="@mipmap/launcher_icon"
android:usesCleartextTraffic="true"
android:enableOnBackInvokedCallback="true">
@@ -1,7 +1,10 @@
package me.movenext.bang_navigator
import android.content.Context
import android.os.Bundle
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.FlutterEngineCache
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterFragmentActivity() {
@@ -10,6 +13,7 @@ class MainActivity: FlutterFragmentActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
}
@@ -17,4 +21,12 @@ class MainActivity: FlutterFragmentActivity() {
super.onTrimMemory(level)
channel.invokeMethod("onTrimMemory", level)
}
override fun getCachedEngineId(): String {
return "engine_id"
}
override fun shouldDestroyEngineWithHost(): Boolean {
return false // Keep engine alive when activity is destroyed
}
}
@@ -0,0 +1,46 @@
package me.movenext.bang_navigator
import android.app.ActivityManager
import android.app.Application
import android.content.Context
import android.util.Log
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.FlutterEngineCache
import io.flutter.embedding.engine.dart.DartExecutor
class MyApplication : Application() {
private fun getProcessNameCompat(): String {
// Try to get process name from ActivityManager
val pid = android.os.Process.myPid()
val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
for (processInfo in manager.runningAppProcesses) {
if (processInfo.pid == pid) {
return processInfo.processName
}
}
// Fallback to package name if process name cannot be determined
return packageName
}
override fun onCreate() {
super.onCreate()
val processName = getProcessNameCompat()
// Only initialize Flutter engine in the main process
if (processName == packageName) {
// Initialize the Flutter engine
val flutterEngine = FlutterEngine(this)
// Pre-warm the Flutter engine with your initial route
flutterEngine.navigationChannel.setInitialRoute("/")
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
// Cache the Flutter engine
FlutterEngineCache.getInstance().put("engine_id", flutterEngine)
}
}
}