Android與flutter生命周期交互

以下說明均基于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來進行裹赴,這個之后再做探討喜庞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棋返,隨后出現(xiàn)的幾起案子延都,更是在濱河造成了極大的恐慌,老刑警劉巖睛竣,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晰房,死亡現(xiàn)場離奇詭異,居然都是意外死亡射沟,警方通過查閱死者的電腦和手機殊者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏惋,“玉大人幽污,你說我怎么就攤上這事〔疽蹋” “怎么了距误?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵簸搞,是天一觀的道長。 經(jīng)常有香客問我准潭,道長趁俊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任刑然,我火速辦了婚禮寺擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泼掠。我一直安慰自己怔软,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布择镇。 她就那樣靜靜地躺著挡逼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腻豌。 梳的紋絲不亂的頭發(fā)上家坎,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音吝梅,去河邊找鬼虱疏。 笑死,一個胖子當(dāng)著我的面吹牛苏携,可吹牛的內(nèi)容都是我干的做瞪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兜叨,長吁一口氣:“原來是場噩夢啊……” “哼穿扳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起国旷,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤矛物,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后跪但,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體履羞,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年屡久,在試婚紗的時候發(fā)現(xiàn)自己被綠了忆首。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡被环,死狀恐怖糙及,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筛欢,我是刑警寧澤浸锨,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布唇聘,位于F島的核電站,受9級特大地震影響柱搜,放射性物質(zhì)發(fā)生泄漏迟郎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一聪蘸、第九天 我趴在偏房一處隱蔽的房頂上張望宪肖。 院中可真熱鬧,春花似錦健爬、人聲如沸控乾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱持。三九已至,卻和暖如春魔熏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸽扁。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工蒜绽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桶现。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓躲雅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骡和。 傳聞我的和親對象是個殘疾皇子相赁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354