【攻击涨停板源码】【pcre源码包下载】【qt项目源码 解读】oncreate方法源码_oncreate方法在哪

时间:2024-12-28 10:01:30 来源:洪帮主情绪周期源码 分类:知识

1.Android N 四大组件的工作原理
2.Navigation源码解析及自定义FragmentNavigator详解
3.Android中View的创建过程

oncreate方法源码_oncreate方法在哪

Android N 四大组件的工作原理

       æœ¬æ–‡ä¾§é‡è®²è§£android N 系统中四大组件的工作原理,不同系统原理略有差别。通过分析四大组件的工作流程加深对Android Framework的理解,也为插件化开发打下基础。

        Activity

        展示一个界面并和用户交互,它扮演的是一个前台界面的角色。

        Service

        计算型组件,用于后台执行一系列计算任务,工作在主线程,耗时操作需要另起线程, 分为启动状态和绑定状态。

        BroadcastReceiver

        消息型组件,主要用于不同组件或者不同应用之间的消息传递,它工作在系统内部,不适合执行耗时操作,操作超过5s,会出现ANR。

        ContentProvider

        数据共享型组件,用于向其他组件或者应用共享数据,主要执行CURD操作。

        我们启动一个activity有两种方法,

        第一种(Activity直接启动方式):

        Intent intent = new Intent(this,法方法 MainActivity.class);

        startActivity(intent);

        第二种(Context启动方式)

        Intent intent = new Intent(this, MainActivity.class);

        getApplicationContext().startActivity(intent);

        不同的启动方式Activity的工作流程有点差别。

        两种启动都会调用到Instrumentation类中的execStartActivity的方法,系统最终是通过ActivityThread中的performLaunchActivity完成Activity的创建和启动。

        performLaunchActivity方法主要完成以下工作:

        1、通过ActivityClientRecord对象获取启动activity的组件信息

        2、通过mInstrumentation对象的newActivity方法调用classloader完成activity的创建

        3、通过r.packageInfo(LoadedApk 对象)的makeApplication方法尝试创建Application对象

        4、创建ContextImpl对象并调用Activity的attach方法完成一些数据的初始化

        5、调用Activity的onCreate方法

        在Activity启动的过程中,App进程会频繁地与AMS进程进行通信:

        App进程会委托AMS进程完成Activity生命周期的管理以及任务栈的管理;这个通信过程AMS是Server端,App进程通过持有AMS的client代理IActivityManager完成通信过程;

        AMS进程完成生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调;这个通信过程也是通过Binder完成的,App所在server端的Binder对象存在于ActivityThread的内部类ApplicationThread;AMS所在client通过持有IApplicationThread的代理对象完成对于App进程的通信。

        Service有两种启动方式,startService()和bindService(),两种状态可以并存:

        startService流程

        bindService流程

        BroadcastReceiver的工作过程主要包括广播的注册、发送和接收:

        动态注册过程:

        发送过程

        静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。

        每个进程的入口都是ActivityThead.main(),App的启动流程如下:

        从源码中可以看出:

        应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。

        attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。

        attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。

        由上图可以看出,在ContentProvider的启动过程中伴随着app进程的启动。

        ContentProvider的其他CURD操作如insert,delete,update跟query的流程类似。

Navigation源码解析及自定义FragmentNavigator详解

       谷歌推出的Navigation主要目标是统一应用内页面跳转行为。使用方法简单,源码新项目选择Bottom Navigation Activity,法方法系统自动生成页面逻辑。源码攻击涨停板源码

       Navigation源码设计简洁,法方法包含多个关键类。源码其中,法方法NavHostFragment是源码直接在XML文件中定义的,其生命周期方法onCreate中直接创建了NavHostController,法方法并通过findNavController暴露给外部调用者。源码NavHostController继承自NavController。法方法pcre源码包下载在此过程中,源码通过navController获取NavigatorProvider并添加了两个Navigator:DialogFragmentNavigator和FragmentNavigator。法方法NavController构造方法中还额外添加了两个Navigator,源码分别对应DialogFragment、法方法Fragment和Activity的qt项目源码 解读页面跳转。NavGraphNavigator用于在XML配置的navGraph与根节点文件中的startDestination之间实现跳转,功能单一。

       各个Navigator通过重写navigate方法实现各自的跳转逻辑。FragmentNavigator的关键实现在于注释1处,使用replace加载Fragment,vc黑客源码这不符合实际开发需求。文章后续将解释如何自定义FragmentNavigator以避免Fragment在切换时执行生命周期。

       NavigatorProvider内部维护了一个HashMap存储相关Navigator信息,通过获取Navigator的注解Name作为键和getClass作为值进行存储。在onCreate方法中,yolo2 源码mNavController调用了setGraph,解析XML配置的mobile_navigation节点信息文件,根据不同的节点各自解析。通过获取NavInflater进行解析,返回NavGraph,NavGraph继承自NavDestination,保存了所有解析出的节点信息。

       总结,通过NavHostFragment获取到NavContorl并存储了相关Navigator信息。通过各自navigate方法进行页面跳转,通过setGraph解析配置的页面节点信息并封装为NavGraph对象。其中,通过SparseArray存储Destination信息。

       自定义Navigator实现思路主要在于继承现有FragmentNavigator并重写其navigate方法,将replace方法替换为show和hide方法,完成Fragment切换。通过@Navigator.Name(value)注解标记自定义类为Navigator,加入NavigatorProvider中即可识别。自定义Navigator核心代码实现后,需调整mobile_navigation节点中的fragment为fixFragment,并删除布局文件中NavHostFragment节点信息,手动关联FixFragmentNavigator与NavControl,完成Fragment切换时生命周期不会重新执行。

Android中View的创建过程

        我们知道在onCreate里面View还是没有测绘完成的。那么什么时候测绘完成了?答案是onResume。

        通过查看源码 我们可以看到在onCreate方法里面调用了getWindow()方法然后在将我们的页面塞到这个window里面。这个window也就是PhonwWindow.

        那PhoneWindow是什么时候被创建的?

        这就引出了Activity的创建流程。

那Activity是怎么被创建的呢?

        由于Activity是一个组件他是由系统使用ActivityThread方法去创建的。

        现在我来分析下:

        先来到ActivityThread类的handleLaunchActivity方法。

        可以看到他去调用了Activity的performCreate方法。

        现在我们终于看到onCreate方法被调用了。

        这里还有个重点,在performLaunchActivity里面去调用Activity的onCreate方法之前还去做了一件很重要的事情,这个事情在第行:调用了Activity的attach方法。

        现在跟到Activity的attach方法:找到了我们一直找的PhoneWindow的创建。