背景:
在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,代表是程序入口。我们只要统计一次即可。
通过时间做减法,即可得出冷启动的耗时。
|