Android 啓動普通的Flutter screen
文章目錄
將FlutterActivity添加到AndroidManifest.xml
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
對@style/LaunchTheme的引用可以被任何想要應用到FlutterActivity的Android主題所代替
主題的選擇決定了應用到Android系統chrome上的顏色,比如Android的導航條,以及在Flutter UI首次呈現之前FlutterActivity的背景顏色
啓動FlutterActivity
startActivity(FlutterActivity.createDefaultIntent(MainActivity.class));
前面的示例假設您的Dart入口點稱爲main(),而您的初始Flutter路由爲’ / '。Dart進入點不能使用Intent來改變,但是初始路線可以使用Intent來改變。下面的示例演示如何啓動一個FlutterActivity,該活動最初在Flutter中呈現一個自定義路由
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("/my_route")
.build(this)
);
將“/my_route”替換爲您想要的初始路由。
使用withNewEngine()工廠方法配置一個FlutterActivity,該活動在內部創建自己的FlutterEngine實例。這帶來了一個重要的初始化時間。另一種方法是指示FlutterActivity使用預先預熱的、緩存的FlutterEngine,這將最小化Flutter的初始化時間。下面將討論這種方法
使用緩存的FlutterEngine
默認情況下,每個FlutterActivity都創建自己的FlutterEngine。每個FlutterEngine都有一個非平凡的預熱時間。這意味着在您的Flutter體驗變得可見之前,啓動一個標準的FlutterActivity會有一個短暫的延遲。爲了儘量減少這種延遲,你可以在到達你的FlutterActivity之前預熱一個FlutterEngine,然後你可以使用你的預熱過的FlutterEngine。
要預熱一個FlutterEngine,請在應用程序中找到一個合理的位置來實例化一個FlutterEngine。下面的示例在Appl中任意預熱一個FlutterEngine
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Instantiate a FlutterEngine.
flutterEngine = new FlutterEngine(this);
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartEntrypoint.createDefault()
);
// Cache the FlutterEngine to be used by FlutterActivity.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine);
}
}
傳給FlutterEngineCache的ID可以是任何你想要的。確保將相同的ID傳遞給任何應該使用緩存的FlutterEngine的FlutterActiity或FlutterFragment。接下來將討論如何在緩存的FlutterEngine中使用FlutterActivity。
Note:要預熱一個FlutterEngine,你必須執行一個Dart entrypoint。請記住,在調用executeDartEntrypoint()的那一刻,您的Dart entrypoint方法就開始執行了。如果您的Dart entrypoint調用runApp()來運行一個Flutter應用程序,那麼Flutter app的行爲就像它在一個零大小的窗口中運行,直到這個FlutterEngine被附加到一個FlutterActivity、FlutterFragment或FlutterView上。請確保您的應用程序的運轉在預熱和顯示Flutter 的內容之間。
有了預先預熱的緩存的FlutterEngine,現在需要指示您的FlutterActivity使用緩存的FlutterEngine,而不是創建一個新的FlutterEngine。爲此,使用FlutterActivity的withCachedEngine()構建器:
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.build(currentActivity)
);
在使用withCachedEngine()工廠方法時,傳遞與緩存所需的FlutterEngine時相同的ID。現在,當您啓動FlutterActivity時,Flutter內容的顯示延遲明顯減少。
Note:當使用緩存的FlutterEngine時,該FlutterEngine比任何顯示它的FlutterActivity或FlutterFragment都要長。請記住,在對FlutterEngine進行預熱之後,Dart代碼就開始執行,並在銷燬FlutterActivity/FlutterFragment之後繼續執行。要停止執行並清除資源,從FlutterEngineCache獲取您的FlutterEngine並使用FlutterEngine.destroy()
.銷燬它
Note:運行時性能並不是預熱和緩存FlutterEngine的唯一原因。預熱的FlutterEngine獨立於FlutterActivity執行Dart代碼,這使得這樣的FlutterEngine可以在任何時候執行任意Dart 代碼。非ui應用程序邏輯可以在FlutterEngine(如網絡和數據緩存)中執行,也可以在服務或其他地方的後臺行爲中執行。當使用FlutterEngine在後臺執行行爲時,一定要遵守所有Android對後臺執行的限制
注意:Flutter的 debug/release版本具有截然不同的性能特徵。要評估Flutter的性能,請使用release構建。
帶有緩存引擎的初始路由
帶有緩存引擎的初始路由當配置一個新的FlutterEngine的FlutterActivity或FlutterFragment時,可以使用初始路由的概念。但是,當使用緩存引擎時,FlutterActivity和FlutterFragment沒有提供初始路由的概念。這是因爲緩存的引擎應該已經在運行Dart代碼了,這意味着現在配置初始路由已經太晚了。希望緩存引擎從自定義初始路由開始的開發人員可以配置緩存的FlutterEngine,在執行Dart入口點之前使用自定義初始路由。下面的示例演示如何使用帶有緩存引擎的初始路由
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Instantiate a FlutterEngine.
flutterEngine = new FlutterEngine(this);
// Configure an initial route.
flutterEngine.getNavigationChannel().setInitialRoute("your/route/here");
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartEntrypoint.createDefault()
);
// Cache the FlutterEngine to be used by FlutterActivity or FlutterFragment.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine);
}
}
通過設置導航通道的初始路由,關聯的FlutterEngine在初始執行runApp() Dart函數時顯示所需的路由
在初始執行runApp()之後更改導航通道的初始路由屬性沒有效果。希望在不同的Activitys和Fragments之間使用相同的FlutterEngine並在這些顯示之間切換路由的開發人員需要設置一個方法通道,並顯式地指示他們的Dart代碼更改導航器路由。
添加半透明的Flutter屏幕
要使您的FlutterActivity透明,請對創建和啓動FlutterActivity的常規過程進行以下更改
使用半透明的主題
Android需要一個特殊的主題屬性爲Activitys渲染一個半透明的背景。使用以下屬性創建或更新Android主題:
<style name="MyTheme" parent="@style/MyParentTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
然後,將半透明的主題應用到你的FlutterActivity中
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/MyTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
你的FlutterActivity現在支持半透明。接下來,您需要使用顯式透明支持來啓動FlutterActivity
啓動用透明度的FlutterActivity
要在透明的背景下啓動FlutterActivity,請將適當的BackgroundMode傳遞給IntentBuilder
startActivity(
FlutterActivity
.withNewEngine()
.backgroundMode(FlutterActivity.BackgroundMode.transparent)
.build(context)
);
// Using a cached FlutterEngine.
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.backgroundMode(FlutterActivity.BackgroundMode.transparent)
.build(context)
);
現在您有了一個具有透明背景的FlutterActivity
注意:確保你的Flutter content也包括一個半透明的背景。如果您的Flutter UI繪製了一個實心的背景色,那麼它看起來仍然像是您的FlutterActivity擁有一個不透明的背景。
Android 關於FlutterEngine 加載flutter的問題
初始化了引擎,不管是使用FlutterActivity.withNewEngine()還是FlutterActivity.withCachedEngine,
Dart的main()函數都會執行,StatefulWidget中的State的initState方法也會調用,請查看使用緩存的FlutterEngine
ter的問題
初始化了引擎,不管是使用FlutterActivity.withNewEngine()還是FlutterActivity.withCachedEngine,
Dart的main()函數都會執行,StatefulWidget中的State的initState方法也會調用,請查看使用緩存的FlutterEngine