-
冷启动:
在启动应用时,系统中没有该应用的进程,这时系统会创建一个新的进程分配给该应用; -
热启动:
在启动应用时,系统中已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程还是保留在后台)
冷启动:
Application onCreate 在冷启动的时候执行一次
Application.ActivityLifecycleCallbacks 监听是用来监听所有 Activity 的生命周期回调 :可判断应用前后台/ 热启动
application:
public class ColdApplication extends Application {
/**
* 启动状态临时标识
*/
public static boolean tempCL;
/**
* 是否是冷启动
*/
public static boolean isColdLaunch;
@Override
public void onCreate() {
super.onCreate();
Log.e("ColdApplication", "------------------ColdApplication onCreate");
tempCL = true;
// 注册activity 生命周期回调检测
this.registerActivityLifecycleCallbacks(new ColdActivityLifecycleCallbacks());
}
}
ColdActivityLifecycleCallbacks:
public class ColdActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
private int mFinalCount;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
mFinalCount++;
//如果mFinalCount ==1,说明是从后台到前台
if (mFinalCount == 1) {
Log.e("ColdApplication", "---------ColdApplication----ColdActivityLifecycleCallbacks");
// 进入前台 改为热启动
ColdApplication.isColdLaunch = false;
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
mFinalCount--;
//如果mFinalCount ==0,说明是前台到后台
if (mFinalCount == 0) {
Log.e("ColdApplication", "---------ColdApplication----ColdActivityLifecycleCallbacks onActivityStopped");
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
Mainactivity:
public class MainActivity extends AppCompatActivity {
private boolean isHomePageCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
if (!isHomePageCreated) {
ColdApplication.isColdLaunch = ColdApplication.tempCL;
ColdApplication.tempCL = false;
isHomePageCreated = true;
Log.e("ColdApplication", "------------MainActivity----ColdApplication:onStart");
}
Log.e("MainActivity", "---是否是冷启动:" + (ColdApplication.isColdLaunch ? "是冷启动" : "非冷启动"));
}
}
冷启动执行顺序:
2020-10-15 15:15:48.894 7870-7870/? E/ColdApplication: ------------------ColdApplication onCreate
2020-10-15 15:15:48.997 7870-7870/? E/ColdApplication: ---------ColdApplication----ColdActivityLifecycleCallbacks onActivityStarted
2020-10-15 15:15:48.997 7870-7870/? E/ColdApplication: ------------MainActivity----ColdApplication:onStart
home键退出: 应用退到后台
2020-10-15 15:15:52.048 7870-7870/com.zhangwen.coldlaunch E/ColdApplication: ---------ColdApplication----ColdActivityLifecycleCallbacks onActivityStopped
再次点击应用图标即为 热启动:
2020-10-15 15:15:53.333 7870-7870/com.zhangwen.coldlaunch E/ColdApplication: ---------ColdApplication----ColdActivityLifecycleCallbacks onActivityStarted
本文详细介绍了Android应用的冷启动和热启动概念,以及它们在实际运行中的区别。通过分析`Application.onCreate()`、`ActivityLifecycleCallbacks`以及`MainActivity.onStart()`等关键方法的调用来辨别应用的启动状态。当应用首次启动时,会执行冷启动,而从后台切换到前台则属于热启动。示例代码展示了如何利用`ActivityLifecycleCallbacks`监听并判断启动类型。
2045

被折叠的 条评论
为什么被折叠?



