zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android 冷启动耗时,时长统计

Android统计 耗时
2023-09-27 14:27:35 时间

背景:

在App的开发过程中,application是一个程序的入口,一般好多程序都是在这里初始化,抢占初始化最佳时机。由于很多初始化抢占时机会导致进程在初始化的时候特别耗时,这样会导致app的体验急剧下降。如何监控app冷起已成为一个热门话题。

冷起占用时间过长,会导致在体验等各方面都很不好。这时,我们需要统计哪些设备在冷起比较耗时。

冷起:又叫新进程创建,指当前app进行不在虚拟机内,需要创新创建。从创建和第一个页面的过程,叫冷起。

如何统计冷起:

1:我们只需要在application中进行即可。每个页面或者application在被加载到内存中都会回调

attachBaseContext(Context)。即当前已被添加成功。所以在application中,我们只需要在
attachBaseContext(Context)中记录一下启动时间,
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    starttime = System.currentTimeMillis();
}

2:监听第一个页面(action=Main)的入口页面,如何监听?其实我们可以通过

registerActivityLifecycleCallbacks()监听activity的生命周期回调来监听。

在application中注册一个生命周期回调,

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

我们根据自己的业务在指定的回调方法进行业务判断,接下来我们采用onActivityCreated()进行处理。如果你认为onActivityStarted()才算启动完成,也可以将代码添加在此处。

接下来处理tagActivity的启动模式,判断是否是入口页面

public static final String ACTON_MAIN = "android.intent.action.MAIN";

Set<String> set = activity.getIntent().getCategories();
//<category android:name="android.intent.category.LAUNCHER" />
String action = activity.getIntent().getAction();
//<action android:name="android.intent.action.MAIN"/>
if (TextUtils.equals(ACTON_MAIN, action)) {
    endTime = System.currentTimeMillis();
    long total = endTime - starttime;
}

如果当前action是android.intent.action.MAIN,代表是程序入口。我们只要统计一次即可。

通过时间做减法,即可得出冷启动的耗时。