Android-Activity生命周期

Activity生命周期

Activity作为Android的四大组件之一,非常的重要,也是最常用的四大组件,使用Activity必须要在AndroidManifest中进行注册,那么作为Android的基础,Activity的生命周期你是否完全掌握了呢?下面就让我们来一起回顾一下Activity的生命周期吧!

首先,你需要知道 Activity的生命周期分为两种。

  1. 典型情况下的生命周期(就是我们开发中经常用到的)
  2. 异常情况下的生命周期(虽说开发中也会用到,但是并不是所有的项目都会去(需要)回调异常生命周期的方法)

所以我们先来介绍前者,因为后者出现的情况比较特殊。

典型情况下的生命周期

说明

  1. onCreate:在首次创建 Activity 时调用。系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态,而后会调用onStart方法。(可以在此方法中执行所有正常的静态设置 ,比如:创建视图、将数据绑定到列表等等。)
  2. onStart:在 Activity 即将对用户可见之前调用。而后如果Activity转入了前台就会调用onResume方法。 如果此时直接屏幕熄灭或者用户按下home键则会直接调用onStop方法,当然这种情况比较极端。
  3. onResume:在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。当跳转另一个Activity,或者退出当前Activity后会调用onPause方法。
  4. onPause:在系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行,所以不能执行耗时操作。而后正常情况下会调用onStop方法。但是有一种极端情况,就是如果这个时候快速让 当前Activity 返回前台,则会调用onResume方法。
  5. onStop:在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就会调用此方法。而后如果 Activity 恢复与用户的交互,则会调用 onRestart 方法,如果 Activity 被销毁,则会调用onDestroy方法。
  6. onRestart:在Activity被停止后再次启动时调用(即屏幕熄灭后再次回到app,按下home键后再次回到app),而后会调用onStart方法。
  7. onDestroy:在 Activity 被销毁前调用,这是 Activity 收到的最后调用。 当 Activity 结束(对 Activity 调用了 finish 方法),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 你可以通过 isFinishing 方法区分这两种情形。
举例
String TAG = "myTag";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_main);
    Log.d(TAG,"onCreate:");
}

@Override
protected void onStart() {
    super.onStart();
    Log.d(TAG,"onStart:");
}


@Override
protected void onResume() {
    super.onResume();
    Log.d(TAG,"onResume:");
}

@Override
protected void onPause() {
    super.onPause();
    Log.d(TAG,"onPause;");
}

@Override
protected void onStop() {
    super.onStop();
    Log.d(TAG,"onStop:");
}

@Override
protected void onRestart() {
    super.onRestart();
    Log.d(TAG,"onRestart");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.d(TAG,"onDestroy:");
}

启动后显示:

回到手机主界面:

再次回到应用:

退出应用/翻转虚拟机:


LifeCycles(让组件感知生命周期,Activity进一步解耦)
计时小案例
public class MainActivity extends AppCompatActivity {

    private Chronometer meter = null;
    private long elapsedTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        meter = findViewById(R.id.meter);
        //SystemClock.elapsedRealtime()就是从软件启动开始计时,退出结束,后台依然计时
        meter.setBase(SystemClock.elapsedRealtime());
    }

    @Override
    protected void onResume() {
        super.onResume();
        //将 当前运行时间-此前计时时间 设置为base时间;
        //也就是说base时间与此时的已运行时间相差elapsedTime,也就是此前的已运行时间,然后接着计时
        meter.setBase(SystemClock.elapsedRealtime() - elapsedTime);
        meter.start();
    }



    @Override
    protected void onPause() {
        super.onPause();
        //获取此时已经计时的时间
        elapsedTime = SystemClock.elapsedRealtime() - meter.getBase();
        //并不会真的停止计时,后台其实还在计时
        meter.stop();
    }
}

调用start(); 函数定时器开始计时,调用stop(); 函数当然就应该是停止(字面理解),但是stop() 的停止是停止视图计时(变动),但是后台其实还是在计时,毕竟依赖的是系统开机时间来计时的,stop() 方法是不可能把开机时间停止下来的

LifeCycles

在上面的例子中,有一个问题:如果我们相似的组件太多,就会使activity中过于耦合。这时使用LifeCycles,让组件自身去感知生命周期的变化,可以使组件的独立性更高。

创建一个我们自定义组件

public class MyChronometer extends Chronometer implements LifecycleObserver {

    private Long elapsedTime;

    public MyChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void pauseMeter(){
        elapsedTime = SystemClock.elapsedRealtime() - getBase();
        stop();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void resumeMeter(){
        setBase(SystemClock.elapsedRealtime() - elapsedTime);
        start();
    }
}

添加观察者

private Chronometer meter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    meter = findViewById(R.id.meter);
    getLifecycle().addObserver((LifecycleObserver) meter);
}

使用该组件

效果与上面的效果一样,但是如果我们的屏幕翻转,就会重新计时。一个简单的方法,elapsedTime设置为静态的就可以了

private static Long elapsedTime = 0L;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值