Android 四大组件基础 Activity 生命周期

本文详细介绍了Android中Activity的生命周期,并通过实例演示了不同状态之间的转换。重点解释了用户可见及可交互的状态,以及如何处理多个Activity间的启动和切换。

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

Android 四大组件中让我们产生最直观的感受的,还是 Activity。因为其重要性,网上已经有太多的例子,这里作此记录以加深印象。
首先我们看谷歌官方给定的一张生命周期图片:
Activity 生命周期
一般情况下, Activity 经历的完整的生命周期为:
onCreate → onStart → onResume → onPause → onStop → onDestory

其中对于用户可见的部分为 onStart 调用之后, onStop 调用之前,其它时刻用户不可见。

其中用户可操作的部分为 onResume 调用之后, onPause 调用之前,其它时候用户不可操作。

一般情况下 onStart/onStop 对 与 onResume/onPause 对可以混用,但如果用户启动的一个新的 activity 是一个透明的 activity 或者并不能完全覆盖当前 activity 时, 当前 activity 不会调用 onStop, 当新的 activity 结束时, 本 activity 不会调用 onStart, 这里需要根据具体情况在不同的地方做相应处理。
根据上述内容,以及流程图,可以很清晰地看出单个 activity 是如何工作的,但是每个应用都不可能只有一个 activity, 每个应用又是如何去处理这些 activities 的呢?

那么再看一下多个 activity 是如何启动的。
在这里,我们封装一个简单的 BaseActivity:

public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener{

    private static List<AppCompatActivity> activityList = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getInfoView());
        activityList.add(this);
        log("onCreate");
        log("activities: " + activityList.toString());
    }

    @Override
    protected void onStart() {
        super.onStart();
        log("onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        log("onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        log("onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        log("onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        log("onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        activityList.remove(this);
        log("onDestroy");
        log("activities: " + activityList.toString());
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        log("onSaveInstanceState");
    }

    private View getInfoView(){
        TextView textView = new TextView(this);
        textView.setText(this.getClass().getName());
        textView.setGravity(Gravity.CENTER);
        textView.setOnClickListener(this);
        return textView;
    }

    public void log(@NonNull String msg){
        Log.e(this.getClass().getSimpleName(), msg);
    }

}

让 MainActivity, 以及 SecondActivity 继承 BaseActivity

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onClick(View v) {
        super.log("Click");
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }
}
public class SecondActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onClick(View v) {
        super.log("Click");
        finish();
    }
}

启动 MainActivity 后单击 TextView 启动 SecondActivity 之后 再单击 TextView 后,产生了下面的一系列的日志:
lifecycle
可以看到,在 MainActivity 时 click 后,首先 MainActivity 运行 Pause, 然后开始 SecondActivity 的 create start resume 过程,当 SecondActivity Resume 之后 MainActivity 就不可见了,这时候 MainActivity 对应 Stop 了。
而在 SecondActivity 中单击 stop 之后 SecondActivity 首先 pause 然后让 MainActivity 显示出来,然后继续执行 SecondActivity 的销毁流程。

在不对 ams 进行深入分析的情况下,以上便是此次记录全部内容了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值