Android 判断冷启动 热启动 (应用在前台/ 后台)

本文详细介绍了Android应用的冷启动和热启动概念,以及它们在实际运行中的区别。通过分析`Application.onCreate()`、`ActivityLifecycleCallbacks`以及`MainActivity.onStart()`等关键方法的调用来辨别应用的启动状态。当应用首次启动时,会执行冷启动,而从后台切换到前台则属于热启动。示例代码展示了如何利用`ActivityLifecycleCallbacks`监听并判断启动类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • 热启动:
    在启动应用时,系统中已有该应用的进程(例:按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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值