真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Flutter的啟動流程有哪些

本篇文章為大家展示了Flutter的啟動流程有哪些,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),達(dá)茂旗企業(yè)網(wǎng)站建設(shè),達(dá)茂旗品牌網(wǎng)站建設(shè),網(wǎng)站定制,達(dá)茂旗網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,達(dá)茂旗網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

從MainActivity開始

新創(chuàng)建一個Flutter項目,在清單文件中默認(rèn)被啟動的Activity是MainActivity,而MainActivity繼承的是FlutterActivity。那么問題好像簡單了,我們分析一下FlutterActivity,下面是MainActivity的代碼。

public class MainActivity extends FlutterActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 GeneratedPluginRegistrant.registerWith(this);
 }
}

上面的源碼很簡單,有兩個點(diǎn)需要關(guān)注,第一個就是在MainActivity.onCreate()中調(diào)用了GeneratedPluginRegistrant.registerWith()這個方法,第二個是MainActivity繼承自FlutterActivity,我們對這兩個關(guān)注點(diǎn)依次進(jìn)行分析。

GeneratedPluginRegistrant.registerWith()分析

我們查看GeneratedPluginRegistrant,發(fā)現(xiàn)這個類是Android Studio自動生成的,并且不建議修改,這個類也非常簡單,下面是GeneratedPluginRegistrant的代碼。

public final class GeneratedPluginRegistrant {
 public static void registerWith(PluginRegistry registry) {
 if (alreadyRegisteredWith(registry)) {
 return;
 }
 }

 private static boolean alreadyRegisteredWith(PluginRegistry registry) {
 final String key = GeneratedPluginRegistrant.class.getCanonicalName();
 if (registry.hasPlugin(key)) {
 return true;
 }
 registry.registrarFor(key);
 return false;
 }
}

如果PluginRegistry已經(jīng)包含了GeneratedPluginRegistrant就直接返回true,如沒有就調(diào)用PluginRegistry.registrarFor()進(jìn)行注冊。

我們分析一下PluginRegistry,看看是怎么注冊的,發(fā)現(xiàn)PluginRegistry是一個接口,下面是PluginRegistry的代碼。

public interface PluginRegistry {
 Registrar registrarFor(String pluginKey);
}

PluginRegistry的實(shí)現(xiàn)是誰呢?是FlutterActivity,下面開發(fā)分析FlutterActivity,暫時看FlutterActivity比較重要,因?yàn)檫@個類是MainActivity的父類,還是PluginRegistry的具體實(shí)現(xiàn)類。

FlutterActivity分析

下面是FlutterActivity的代碼。

public class FlutterActivity extends Activity implements FlutterView.Provider, PluginRegistry, ViewFactory {
 private final FlutterActivityDelegate delegate = new FlutterActivityDelegate(this, this);
 
 private final FlutterActivityEvents eventDelegate = delegate;
 private final FlutterView.Provider viewProvider = delegate;
 private final PluginRegistry pluginRegistry = delegate;
 
 @Override
 public final boolean hasPlugin(String key) {
 return pluginRegistry.hasPlugin(key);
 }

 @Override
 public final Registrar registrarFor(String pluginKey) {
 return pluginRegistry.registrarFor(pluginKey);
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 eventDelegate.onCreate(savedInstanceState);
 }

 @Override
 protected void onDestroy() {
 eventDelegate.onDestroy();
 super.onDestroy();
 }
 
 	@Override
 protected void onStop() {
 eventDelegate.onStop();
 super.onStop();
 }
 //省略了一些代碼
}

從上面的代碼中可以看出來,F(xiàn)lutterActivity是繼承Activity和實(shí)現(xiàn)了PluginRegistry。分析一下onCreate,onStop,onDestroy這些生命周期方法被FlutterActivity.eventDelegate代理了,這個時候我們明白了,F(xiàn)lutterActivity就是一個空殼,真正實(shí)現(xiàn)是代理類FlutterActivityDelegate。

我們具體看一下,下面是FlutterActivity.onCreate()的代碼。

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 eventDelegate.onCreate(savedInstanceState);
 }

FlutterActivity.$onCreate()比較簡單,調(diào)用了super的onCreate()eventDelegate.onCreate() ,也就是調(diào)用了代理類的onCreate方法,下面分析FlutterActivityDelegate。

FlutterActivityDelegate分析

從上面的分析可以得出結(jié)論,F(xiàn)lutterActivity什么都沒有做,都交個了FlutterActivityDelegate去干,這里類實(shí)現(xiàn)了PluginRegistry,下面是FlutterActivityDelegate的代碼。

public final class FlutterActivityDelegate
 implements FlutterActivityEvents,
   FlutterView.Provider,
   PluginRegistry {
		@Override
 public void onCreate(Bundle savedInstanceState) {
 
 }   
}

還是先分析FlutterActivityDelegate.onCreate() ,這個真正干活的onCreate方法還是比較復(fù)雜的,下面是FlutterActivityDelegate.onCreate()的代碼。

@Override
public void onCreate(Bundle savedInstanceState) {
 String[] args = getArgsFromIntent(activity.getIntent());//1
 FlutterMain.ensureInitializationComplete(activity.getApplicationContext(), args);//2
 flutterView = viewFactory.createFlutterView(activity);//3
 if (flutterView == null) {
 FlutterNativeView nativeView = viewFactory.createFlutterNativeView();
 flutterView = new FlutterView(activity, null, nativeView);//4
 flutterView.setLayoutParams(matchParent);
 activity.setContentView(flutterView);//5
 launchView = createLaunchView();
 if (launchView != null) {
  addLaunchView();
 }
 }
 if (loadIntent(activity.getIntent())) {
 return;
 }
 String appBundlePath = FlutterMain.findAppBundlePath(activity.getApplicationContext());
 if (appBundlePath != null) {
 runBundle(appBundlePath);
 }
}

注釋1

得到了一些參數(shù),這些參數(shù)是干啥用的?我們拿一個trace-startup參數(shù)為例進(jìn)行簡單介紹下面是FlutterActivityDelegate.getArgsFromIntent()的代碼。

private static String[] getArgsFromIntent(Intent intent) {
 ArrayList args = new ArrayList<>();
 if (intent.getBooleanExtra("trace-startup", false)) {
 args.add("--trace-startup");
 }
 if (intent.getBooleanExtra("start-paused", false)) {
 args.add("--start-paused");
 }
 
 if (!args.isEmpty()) {
 String[] argsArray = new String[args.size()];
 return args.toArray(argsArray);
 }
 return null;
}

當(dāng)你安裝一個App的時候,可以用下面這個命令,

flutter run --trace-startup --profile

安裝完之后會生下面這個json,

{
 "engineEnterTimestampMicros": 273508186457,
 "timeToFrameworkInitMicros": 271420,
 "timeToFirstFrameMicros": 469796,
 "timeAfterFrameworkInitMicros": 198376
}

這個json會顯示進(jìn)入Flutter引擎的時間和展示應(yīng)用第一幀的時間等等。

注釋2

調(diào)用 FlutterMain.ensureInitializationComplete() ,這方法初始化了Flutter,下面是ensureInitializationComplete的代碼。

 public static void ensureInitializationComplete(Context applicationContext, String[] args) {
 if (Looper.myLooper() != Looper.getMainLooper()) {
  throw new IllegalStateException("ensureInitializationComplete must be called on the main thread");
 }
 try {
  sResourceExtractor.waitForCompletion();
  List shellArgs = new ArrayList<>();
  shellArgs.add("--icu-symbol-prefix=_binary_icudtl_dat");
 
  String appBundlePath = findAppBundlePath(applicationContext);
  String appStoragePath = PathUtils.getFilesDir(applicationContext);
  
  nativeInit(applicationContext, shellArgs.toArray(new String[0]),
  appBundlePath, appStoragePath, engineCachesPath);//1
 } catch (Exception e) {
  Log.e(TAG, "Flutter initialization failed.", e);
  throw new RuntimeException(e);
 }
 }

		//native方法
 private static native void nativeInit(Context context, String[] args, String 				bundlePath, String appStoragePath, String engineCachesPath);

先判斷是不是主線程,如果不是主線程直接拋出異常。初始化參數(shù)調(diào)用 FlutterMain.nativeInit()方法,這個方法是native方法,主要的用途是初始化Flutter。

注釋3

ViewFactory是一個接口,ViewFactory.createFlutterView()的具體實(shí)現(xiàn)有兩個,分別是FlutterActivity.createFlutterView()FlutterFragmentActivity.createFlutterView()現(xiàn)在這個兩個具體實(shí)現(xiàn)都返回null,也就是一定會走到注釋4。

注釋4

創(chuàng)建FlutterView,那么FlutterView是什么呢?看一下類的聲明,下面是FlutterView的聲明的代碼,

public class FlutterView extends SurfaceView implements BinaryMessenger, TextureRegistry 

}

原來是一 SurfaceView,這個就很容易理解了。

注釋5

關(guān)鍵來了,下面是調(diào)用setContentView的代碼,

 activity.setContentView(flutterView);

把FlutterView加載到Activity中,折騰了半天,就是做了這樣一件事,說白了就是創(chuàng)建了一個FlutterView,并且把這個view顯示到屏幕上。

下面是Flutter的啟動流程圖。

Flutter的啟動流程有哪些

上述內(nèi)容就是Flutter的啟動流程有哪些,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:Flutter的啟動流程有哪些
本文路徑:http://weahome.cn/article/popsis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部