以下說明均基于io.flutter.embedding包下的flutter類
關(guān)于flutterengine和flutterview:
flutter界面用flutterengine加載砌们,flutter界面用flutterview展示担租。
Engine使用前需要調(diào)用getDartExecutor().executeDartEntrypoint預(yù)熱牌芋,設(shè)置initialRoute只能在預(yù)熱之前(initialRoute是string類型锻梳,可用于傳遞初始化信息給flutter模塊)讹开。
一個engine只能加載一次flutter界面渐裸,且同一時間同一個engine加載的界面只能顯示在一個fluterview上面.(flutterview調(diào)用attachToFlutterEngine依附于engine從而顯示engine加載的界面摊腋,同一個engine的界面只會顯示在最后一個調(diào)用attachToFlutterEngine的flutterview上面)昙沦。
FlutterEngine flutterEngine =new FlutterEngine(this);
//初始化路由信息
flutterEngine.getNavigationChannel().setInitialRoute("test");
//預(yù)熱
flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
FlutterView flutterView =new FlutterView(this);
flutterView.attachToFlutterEngine(flutterEngine);
關(guān)于flutteractivity:
flutteractivity使用一個flutterview來作為“ContentView”辖众。
一個flutteractivity需要一個flutterengine來加載flutter界面卓起,可以指定activity初始化flutterengine的模式:使用緩存或新建。
緩存模式:需要事先初始化一個engine并放入FlutterEngineCache的map中凹炸,并將key值傳給flutteractivity戏阅,再由flutteractivity根據(jù)key值從FlutterEngineCache中取出來,請注意如果key值對應(yīng)的engine并沒有在cache中找到啤它,那么會拋異常奕筐,所以使用緩存模式一定要事先初始化一個engine,該模式適用于展示一些常用頁面蚕键。
FlutterEngineCache.getInstance().put("key",flutterEngine);
Intent intent = io.flutter.embedding.android.FlutterActivity.withCachedEngine("key").build(this);
startActivity(intent);
新建模式:每次都會新建一個engine救欧,跟activity的standard啟動模式類似。
Intent intent = io.flutter.embedding.android.FlutterActivity.withNewEngine().initialRoute("test").build(this);
startActivity(intent);
注意:FlutterEngineCache是非線程安全的單例模式锣光,且內(nèi)部的map也是非線程安全的hashmap笆怠,所以請確保在單一線程中使用cache。
關(guān)于flutterfragment:
與flutteractivity類似誊爹。
關(guān)于自定義flutteractivity:
如果僅是直接使用flutteractivity或者flutterfragment蹬刷,知道以上信息已足夠。若要自定義使用flutter的activity(不繼承flutteractivity)來使用频丘,請注意以下幾點办成。
flutterengine內(nèi)置有一個ActivityControlSurface實例,主要用來處理activity的onactivityresult搂漠、onnewintent等回調(diào)函數(shù)迂卢,官方源碼的使用方法如下:
首先,在activity的oncreate時桐汤,flutterengine需要調(diào)用getActivityControlSurface().attachToActivity來使ActivityControlSurface依附于activity而克。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getEngine()為自定義的獲取engine的方法
getEngine().getActivityControlSurface().attachToActivity(this, getLifecycle());
}
在activity的onDestroy()時,需分兩種情況怔毛,一種是activity真的銷毀员萍,這時需調(diào)用ActivityControlSurface的detachFromActivity(),另一種是屏幕旋轉(zhuǎn)等ConfigChanges帶來的銷毀拣度,這時調(diào)用detachFromActivityForConfigChanges()碎绎。
@Override
protected void onDestroy() {
super.onDestroy();
/*...dosomething*/
if (isChangingConfigurations()) {
getEngine().getActivityControlSurface().detachFromActivityForConfigChanges();
}else {
getEngine().getActivityControlSurface().detachFromActivity();
}
}
在activity的onactivityresult螃壤、onnewintent等方法里面還需要手動調(diào)用ActivityControlSurface的相應(yīng)方法,以此來讓flutter處理onactivityresult筋帖、onnewintent等奸晴。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getEngine().getActivityControlSurface().onActivityResult(requestCode, resultCode, data);
}
除此之外,在activity onresume幕随、onpause蚁滋、onstop、ondestory時赘淮,flutterengine需用內(nèi)置的lifecyclechannel來手動分別調(diào)用appIsResumed()、appIsInactive睦霎、appIsPaused梢卸、appIsDetached以通知flutter界面進入相應(yīng)狀態(tài),如果不使用這些flutter界面將無法正常展示副女。
@Override
protected void onResume() {
super.onResume();
/*...dosomething*/
getEngine().getLifecycleChannel().appIsResumed();
}
@Override
protected void onPause() {
super.onPause();
/*...dosomething*/
getEngine().getLifecycleChannel().appIsInactive();
}
@Override
protected void onDestroy() {
super.onDestroy();
/*...dosomething*/
getEngine().getLifecycleChannel().appIsDetached();
}
小結(jié):
基于此蛤高,自定義flutteractivity適用于即有原生界面又有flutter界面、或者flutter界面需要與原生實時交互的場景碑幅,需開發(fā)者同時調(diào)控原生界面和flutter界面的生命周期和相關(guān)回調(diào)戴陡。官方flutteractivity只能展示flutter界面,如果一個界面僅需要有flutter界面沟涨,使用它準(zhǔn)沒錯恤批。
關(guān)于flutter與android進行實時交互需通過MethodChannel、MessageChannel等channel來進行裹赴,這個之后再做探討喜庞。