Activity生命周期
Activity作为Android的四大组件之一,非常的重要,也是最常用的四大组件,使用Activity必须要在AndroidManifest中进行注册,那么作为Android的基础,Activity的生命周期你是否完全掌握了呢?下面就让我们来一起回顾一下Activity的生命周期吧!
首先,你需要知道 Activity的生命周期分为两种。
- 典型情况下的生命周期(就是我们开发中经常用到的)
- 异常情况下的生命周期(虽说开发中也会用到,但是并不是所有的项目都会去(需要)回调异常生命周期的方法)
所以我们先来介绍前者,因为后者出现的情况比较特殊。
典型情况下的生命周期
说明
- onCreate:在首次创建 Activity 时调用。系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态,而后会调用onStart方法。(可以在此方法中执行所有正常的静态设置 ,比如:创建视图、将数据绑定到列表等等。)
- onStart:在 Activity 即将对用户可见之前调用。而后如果Activity转入了前台就会调用onResume方法。 如果此时直接屏幕熄灭或者用户按下home键则会直接调用onStop方法,当然这种情况比较极端。
- onResume:在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。当跳转另一个Activity,或者退出当前Activity后会调用onPause方法。
- onPause:在系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行,所以不能执行耗时操作。而后正常情况下会调用onStop方法。但是有一种极端情况,就是如果这个时候快速让 当前Activity 返回前台,则会调用onResume方法。
- onStop:在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就会调用此方法。而后如果 Activity 恢复与用户的交互,则会调用
onRestart 方法
,如果 Activity 被销毁,则会调用onDestroy方法。 - onRestart:在Activity被停止后再次启动时调用(即屏幕熄灭后再次回到app,按下home键后再次回到app),而后会调用onStart方法。
- 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;