Android Android 導入Flutter模塊(二)-- 啓動Flutter screen

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章