Activity的生命周期

Posted Denluoyia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity的生命周期相关的知识,希望对你有一定的参考价值。

概述: 四大组件之一的Activity组件,在应用中一个Activity可以用来表示一个界面,我们通常可以理解成“活动”,即一个活动开始,代表Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动。Activity的生命周期交给系统统一管理。

 

先来看千年离不开的Activity生命周期图:

                                 

在Android中,Activity拥有三个基本状态:

  1. Resumed: 一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
  2. Paused: 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但是它失去了焦点,不可与用户交互。
  3. Stopped: 当Activity被另外一个Activity覆盖,失去焦点并不可见时处于Stopped状态。

 

 1 public class MainActivity extends Activity {
 2     public  static final String tag = "MainActivity的生命周期测试---";
 3     private Button button; 
 4     //Activity创建时被调用
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         Log.i(tag, "onCreate");
10         button = (Button) findViewById(R.id.button);
12         button.setOnClickListener(new View.OnClickListener() { 
13             @Override
14             public void onClick(View v) {
15                 //点击button跳转到Main2Activity界面,Main2Activity在配置文件中设置为透明属性
16                 Intent intent = new Intent(MainActivity.this, Main2Activity.class);
17                 startActivity(intent);
18             }
19         });
20     }
21 
22     //Activity重新可见时被调用,接着会调用onStart()
23     @Override
24     protected void onRestart() {
25         super.onRestart();
26         Log.i(tag, "onRestart");
27     }
28 
29     //Activity可见时被调用
30     @Override
31     protected void onStart() {
32         super.onStart();
33         Log.i(tag, "onStart");
34     }
35 
36     //Activity获得焦点,可以进行交互时被调用;处于前台状态
37     @Override
38     protected void onResume() {
39         super.onResume();
40         Log.i(tag, "onResume");
41     }
42 
43     //Activity失去焦点,但是可见(在其他应用需要内存时可能会被kill掉),此状态可以转为前台onResume()
44     @Override
45     protected void onPause() {
46         super.onPause();
47         Log.i(tag, "onPause");
48     }
49 
50     //Activity完全不可见时被调用(可能会被系统kill掉);例如返回到此状态时,如果没有被kill那么就会调用onReStart()
51     @Override
52     protected void onStop() {
53         super.onStop();
54         Log.i(tag, "onStop");
55     }
56     //Activity被销毁时被调用
57     @Override
58     protected void onDestroy() {
59         super.onDestroy();
60         Log.i(tag, "onDestroy");
61     }
62 }

 

设置Main2Activity为透明:

   <activity
            android:theme="@android:style/Theme.Translucent"
            android:name=".Main2Activity"
            android:label="@string/title_activity_main2" >
        </activity>

 

结论:

  • 启动Activity, onCreate()->onStart()->onResume(), Activity处于运行状态(Resumed状态)
  • 10-21 21:00:14.859 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onCreate
    10-21 21:00:14.859 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStart
    10-21 21:00:14.859 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onResume

  •  接下来点击button, 跳转到Main2Activitytou透明界面中,处于onPaused状态
  • 10-21 21:00:36.256  28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onPause

     

  •  从Main2Activitytou返回,则MainActivity的主界面又处于运行状态(Resumed状态)[注意: 但也有可能由于系统内存不足,杀死了这个后台状态的Activity(此时这个Activity引用仍在任务栈中,只是这时候引用指向的对象为null),若再次回到这个Activity则会经过: onCreate() -> onStart() -> onResume() ]。
  • 10-21 21:01:13.813  28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onResume

     

  • Activity退居后台时,即是当Activity转到新的Activity界面(不透明或是Dialog属性),按Home键回到主屏或这是锁屏: onPause -> onStop(), 进入停滞状态 (Stopped状态)
  • 10-21 21:01:47.057 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onPause
    10-21 21:01:47.127 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStop

 

  • 再次回居前台:onRestart() -> onStart() -> onResume(),再次回到运行状态;[注意: 但也有可能由于系统内存不足,杀死了这个后台状态的Activity(此时这个Activity引用仍在任务栈中,只是这时候引用指向的对象为null),若再次回到这个Activity则会经过: onCreate() -> onStart() -> onResume() ]。
  • 10-21 21:02:02.274 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onRestart
    10-21 21:02:02.277 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStart
    10-21 21:02:02.387 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onResume

 

  • 从运行状态点击返回键时,任务栈没有Activity,也就是程序退出了:onPause() -> onStop() -> onDestory()
  • 10-21 21:02:28.791 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onPause
    10-21 21:02:29.221 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onStop
    10-21 21:02:29.221 28836-28836/com.example.lenovo.activitydemo I/MainActivity的生命周期测试---﹕ onDestroy 

 

锁屏: onPause() -> onStop()

解锁: onRestart() -> onStart() -> onResume()

 

以上是关于Activity的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

导航上的片段生命周期重叠

使用 Fragment 和 Activity 执行生命周期流程的问题

自动挂钩到 Activity 生命周期方法的异步任务库

React Native 中的 Android Activity 生命周期 - ViewPager

我可以管理生命周期所有者,用 Koin 注入 viewModel 吗?

Activity的生命周期