安卓大屏导航冷启动和热启动的区别

安卓大屏导航冷启动和热启动的区别,第1张

冷启动:

在启动应用时,系统中没有该应用的进程,这时系统会创建一个新的进程分配给该应用;

热启动:

在启动应用时,系统中已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程还是保留在后台);

二、冷启动、热启动的区别

冷启动:系统没有该应用的进程,需要创建一个新的进程分配给应用,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。 热启动: 从已有的进程中来启动,不会创建和初始化Application类,直接创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

三、冷启动时间的计算

API19 之后,系统会出打印日志输出启动的时间; 冷启动时间 = 应用启动(创建进程) —> 完成视图的第一次绘制(Activity内容对用户可见);

四、冷启动流程

Zygote进程中fork创建出一个新的进程; 创建和初始化Application类、创建MainActivity; inflate布局、当onCreate/onStart/onResume方法都走完; contentView的measure/layout/draw显示在界面上;

总结:

Application构造方法 –> attachBaseContext() –> onCreate() –> Activity构造方法 –> onCreate() –> 配置主题中背景等属性 –> onStart() –> onResume() –> 测量布局绘制显示在界面上。

五、冷启动的优化

减少在Application和第一个Activity的onCreate()方法的工作量; 不要让Application参与业务的 *** 作; 不要在Application进行耗时 *** 作; 不要以静态变量的方式在Application中保存数据; 减少布局的复杂性和深度;

1 冷启动的定义

冷启动:启动应用前,系统中没有该应用的任何进程信息Application等,启动5s+。

11 冷启动时间的计算

这个时间值是从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。

2 热启动的定义

热启动:启动应用时,后台已有该应用的进程,内存中有应用相关Activity(home键退到桌面),启动15s+。

3 温启动的定义

有一些文章有温启动这个启动类型。

温启动:启动应用时,后台已有该应用的进程,内存中没有应用相关Activity(back键退出应用,未清除进程),启动2s+。

冷热启动过程中,会执行的步骤不一样。

冷启动:系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

热启动:一个应用从新进程的创建到进程的销毁,Application只会初始化一次,所以不必创建和初始化Application,直接走MainActivity(包括一系列的测量、布局、绘制)。

二冷启动流程

当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。详细的参考:App(Activity)启动流程

总结应用的启动流程如下:

Application的构造器方 -> attachBaseContext() -> onCreate() -> Activity的构造方法 -> onCreate() -> 配置主题中背景等属性 -> onStart() -> onResume() -> 测量布局绘制显示在界面上。

三如何对冷启动的时间进行优化

冷启动时,加载Application过程中,可能会消耗很多时间。如果不采取任何措施就会产生长时间的白屏或黑屏效果,让用户以为这个应用很卡。消除启动时的白屏/黑屏,请参考:Android冷启动实现APP秒开

1、什么是Android的冷启动时间?

冷启动时间是指用户从手机桌面点击APP的那一刻起到启动页面的Activity调用onCreate()方法之间的这个时间段。

2、在冷启动的时间段内发生了什么?

首先我们要知道当打开一个Activity的时候发生了什么,在一个Activity打开时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程(每创建一个进程都会调用一次Application,所以Application的onCreate()方法可能会被调用多次),在进程的创建和初始化中,势必会消耗一些时间,在这个时间里,WindowManager会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素,然后才去真正的加载布局,如果这个时间过长,而默认的背景又是黑色或者白色,这样会给用户造成一种错觉,这个APP很卡,很不流畅,自然也影响了用户体验。

本文主要学习记录,基于Android 10的源码,有错误欢迎指正,主要目的是梳理流程图。

以进程为单位的调用栈图如下:

1activity中的startActivity方法最终都会通过拿到ATSM的代理IActivityTaskManager调用的startActivity;

2之后进入system server进程中的ATMS startActivity,ATMS 经过收集Intent信息,然后使用ActivityStackSupervisorstartSpecificActivityLocked,如果进程已经存在,则直接使用realStartActivityLocked,通过App的binder客户端的代理ApplicationThread调用回到bindApplication,走入Activity的启动流程;如果进程不存在则通过socket链接Zygote,请求fork新的进程;

3App进程创建完成后,进程启动会调用ActivityThreadmain方法,初始化主线程Handler,接着走入attach方法,然后通过AMS的代理调用AMS的attachApplication方法,并将App进程的通信代理ApplicationThread传入AMS;

4AMS获取到ATMS调用ApplicationThread的bindApplication回到App进程的ActivityThreadApplicationThreadbindApplication方法中,然后使用Handler切换到主线程执行handleBindApplication,这里初始化了App的进程名字、时间,用户的硬件配置,包括App的文件系统,创建了App的Context实例,Instrumentation实例,调用App的onCreate回调方法,同时告诉AMS APP初始化工作完毕;

5AMS接着会调用ATMS的attachApplication,最后调用ClientLifecycleManager的scheduleTransaction方法,通过App的Binder代理ApplicationThread回到ActivityThread;

6进入ActivityThreadApplicationThreadscheduleTransaction方法之后就进入了Activity的onStart、onResume回调

创建进程之前的过程主要是AMS的内部信息收集的判断的过程,下面主要看一下App进程启动的源码流程

从应用进程被创建开始,ActivityThreadmain被执行

调用ActivityThread的attach方法,然后将activity和AMS通信的Binder代理IApplicationThread实例传入AMS

接着进入AMS进程,ActivityManagerServiceattachApplicationLocked

1threadbindApplication :该方法主要讲App进程的配置信息通过IApplicationThread Binder通信回传到ActivityThread中

2mAtmInternalattachApplication :mAtmInternal实际就是ActivityTaskManager的实例,通过LocalServices加载

那么这里相当于走到了ActivityTaskManagerServer的attachApplication中

先看第一条:

注意:ActivityThread中存在于Binder通信的代理--》ApplicationThread extends IApplicationThreadStub

ActivityThread--》ApplicationThread--》bindApplication

这里的bindApplication主要初始化了AppBindData,然后发送BIND_APPLICATION给APP的主线程BIND_APPLICATION,最后执行了handleBindApplication

handleBindApplication如下:

ActivityThread--》class H extends Handler

该方法主要在App进程中对App的一些硬件资源配置申请的属性、App的文件夹等完成App基本信息的初始化

接着看第二条:mAtmInternalattachApplication

mAtmInternalattachApplication最终会调用mRootActivityContainerattachApplication(wpc)

RootActivityContainerattachApplication

接着调用ActivityStackSupervisorrealStartActivityLocked开始创建Activity

ActivityStackSupervisorrealStartActivityLocked

创建ClientLifecycleManager和ClientTransactionHandler来辅助管理Activity的生命周期

注意

clientTransactionaddCallback是LaunchActivityItem

lifecycleItem是ResumeActivityItem

ClientLifecycleManagerscheduleTransaction最终会调用ClientTransaction的schedule方法

那么这个mClient是IApplicationThread的实例,那么此时也就回到了ActivityThread的ApplicationThread中

ActivityThread的ApplicationThread中

因为ActivityThread继承ClientTransactionHandler,所以到了ClientTransactionHandler中

通过Handler发送消息EXECUTE_TRANSACTION到H中

接着TransactionExecutor的execute方法

LaunchActivityItemexecute方法

client其实是在ActivityThread的实例,那么就回到了ActivityThread的handleLaunchActivity

接着调用performLaunchActivity

在performLaunchActivity中,主要是加载App的资源包,然后创建了Activity的context实例,并创建了Activity的实例,接着调用activityattach方法,attach执行完之后调用了onCreate方法。

activityattach

activityattach中主要

1创建了PhoneWindow实例

2设置了Window接口的监听

3初始化了成员变量,包括线程和WindowManager

到此Oncreate已经完成,那么OnStart和OnResume去哪了?

TransactionExecutor的execute方法

之前们只分析了executeCallbacks,接着executeLifecycleState方法

TransactionExecutor的executeLifecycleState方法

cycleToPath:lifecycleItem即为ResumeActivityItem

第一点:

int finish = lifecycleItemgetTargetState()

lifecycleItem对应ResumeActivityItem,如下:

ResumeActivityItem的getTargetState方法

对应ActivityLifecycleItem中的枚举类型:

第二点:ActivityClientRecord中的mLifecycleState,由于在前面已经执行了handleLaunchActivity所以mLifecycleState=1

对应ActivityLifecycleItem中的枚举类型:

PRE_ON_CREATE = 0

所以final int star = 1

接着看getLifecyclePath,此时start=1,finish=3

那么返回的IntArray就是2

接着看performLifecycleSequence

最终执行的是handleStartActivity所以最终走到了ActivityThread的handleResumeActivity

两点:

调用activityperformStart

调用InstrumetationcallActivityOnPostCreate

performStart方法:

调用了InstrumentationcallActivityOnStart方法:

最终到了activity的onStart方法

第二点:InstrumentationcallActivityOnPostCreate

上面主要走了cycleToPath,接着ResumeActivityItemexecute

调用了handleResumeActivity方法

handleResumeActivity最终调用performResumeActivity

调用了InstrumentationcallActivityOnResume,

到了activityonResume()方法

参考文章: >

楼主要的应该是触摸dialog 以外的部分,dialog自动关闭吧?

void setCanceledOnTouchOutside(boolean cancel), 置成truexml的配置文件中也有对应的属性,你自己查一下

可以使用adb命令设置开机自启动:

1 首先连接设备,打开终端,输入 adb devices 命令,确认设备已连接。

2 输入 adb shell 命令,进入设备的shell模式。

3 输入 pm enable <package name> 命令,其中<package name>为要开机自启动的应用的包名。

4 最后,输入 reboot 命令,重启设备,即可完成开机自启动。

ActivityManagerRunningServiceInfo类: 封装了正在运行的服务信息

获取系统里所有真正运行的服务是通过调用ActivityManager方法来得到的,具体方法如下:

List<ActivityManagerRunningServiceInfo> getRunningServices (int maxNum)

功能:返回所有正在运行的服务

参数: maxNum 代表我们希望返回的服务数目大小,一般给个稍大的值即可, 例如,50 。

ActivityManagerRunningServiceInfo 类

常用字段:

long activeSince 服务第一次被激活的时间, 包括启动和绑定方式

int clientCount 如果该Service是通过Bind方法方式连接,则clientCount代表了service连接客户端的数目

int crashCount 服务运行期间,出现死机的次数

boolean foreground 若为true,则该服务在后台执行

int pid 如果不为0,表示该service所在的进程ID号( PS:为0的话我也不清楚 - - 求指点)

int uid 用户ID 类似于Linux的用户权限,例如root等

String process 进程名,默认是包名或者由属性android:process指定

ComponentName service 获得该Service的组件信息 包含了pkgname / servicename信息

PackageManger类

说明: 封装了对应用程序信息的 *** 作

获得应用程序信息的的方法如下:

public abstractApplicationInfo getApplicationInfo(String packageName, int flags)

参数:packagename 包名

flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可

功能:返回ApplicationInfo对象

关于PackageManger更多信息,请查看<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>

Task任务的使用,我也就不在赘述了,大家可以仔细看下SDK,在此推荐一篇博客来帮助大家理解。

以上就是关于安卓大屏导航冷启动和热启动的区别全部的内容,包括:安卓大屏导航冷启动和热启动的区别、Android 10.0 Activity的启动流程、Android 怎么在Activity中启动另一应用程序的方法,无需得到类名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9609997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存