概述
生命周期大致过程
了解 Activity 生命周期——developer.android
(1) onCreate
系统首次创建 Activity 时触发。Activity 会在创建后进入“已创建”状态。在 onCreate() 方法中,您需执行基本应用启动逻辑,该逻辑在 Activity 的整个生命周期中只应发生一次。
(2) onStart
当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持互动做准备。
onStart() 方法会非常快速地完成,并且与“已创建”状态一样,Activity 不会一直处于“已开始”状态。一旦此回调结束,Activity 便会进入“已恢复”状态,系统将调用 onResume() 方法。
(3) onResume
Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生(如包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭),让焦点远离应用。
如果 Activity 从“已暂停”状态返回“已恢复”状态,系统将再次调用 onResume() 方法。因此,您应实现 onResume(),以初始化在 onPause() 期间释放的组件,并执行每次 Activity 进入“已恢复”状态时必须完成的任何其他初始化操作。
(4) onPause
系统将此方法视为用户将要离开您的 Activity 的第一个标志(尽管这并不总是意味着 Activity 会被销毁);此方法表示 Activity 不再位于前台(尽管在用户处于多窗口模式时 Activity 仍然可见)。使用 onPause() 方法暂停或调整当 Activity 处于“已暂停”状态时不应继续(或应有节制地继续)的操作,以及您希望很快恢复的操作。Activity 进入此状态的原因有很多。
例如:
- 如 onResume() 部分所述,某个事件会中断应用执行。这是最常见的情况。
- 在 Android 7.0(API 级别 24)或更高版本中,有多个应用在多窗口模式下运行。无论何时,都只有一个应用(窗口)可以拥有焦点,因此系统会暂停所有其他应用。
- 有新的半透明 Activity(例如对话框)处于开启状态。只要 Activity 仍然部分可见但并未处于焦点之中,它便会一直暂停。
(5) onStop
如果您的 Activity 不再对用户可见,说明其已进入“已停止”状态,因此系统将调用 onStop() 回调。例如,当新启动的 Activity 覆盖整个屏幕时,可能会发生这种情况。如果 Activity 已结束运行并即将终止,系统还可以调用 onDestroy()。
(6) onRestart
onRestart 是当处于非栈顶状态的活动需要再次返回栈顶,即展现给用户的时候,触发该方法。
也就是说执行了onStop()且没有执行onDestroy()的Activity被重新激活时,就会调用onRestart()方法。
(7) onDestroy
销毁 Ativity 之前,系统会先调用 onDestroy()。系统调用此回调的原因如下:
- Activity 即将结束,由于用户彻底关闭 Activity 或由于系统为 Activity 调用 finish();
- 由于配置变更(例如设备旋转或多窗口模式),系统暂时销毁 Activity。
onStop与onDestroy-返回键
Activity#onBackPressed()——developer.android
Android 11及之前按下返回键后Activity的生命周期正常会回调onDestroy,Google在Android 12上修改了按下返回键后Activity的生命周期回调,当Activity声明了ACTION_MAIN和CATEGORY_LAUNCHER的filter,按返回键后会将该activity放到活动栈,其他的普通Activity会被finish。
onPause和onStop的区别
onPause表示当前Activity失去焦点,onStop表示当前页面不可见。
一般情况下,Activity失去焦点后就不可见了。但有些情况下,即使失去焦点但依旧可见。关于在什么情况下只执行onPause,网上有很多说法。经试验,目前遇到的只有当“新的半透明 Activity覆盖在当前Activity上”时,才会只执行onPause。
半透明的Activity通常包括以下情况:
- 自定义的dialog继承自Activity;
- 新启动的Activity的主题为android:theme=”@style/Theme.AppCompat.Dialog”(继承自AppCompatActivity类时)或android:theme=”@android:style/Theme.Dialog”(继承自Activity类时)。
另外要注意区分对话框和半透明Activity的区别,有的半透明Activity比较特殊,看着比较像对话框,如USB连接弹窗(实质是继承自Activity的dialog)。当它出现在其它Activity上时,该Activity的生命周期只会执行到onPause。
Activity日志标签的含义
以下列出了本文中常用的一些日志标签的含义,各个标签定义在各自模块下的EventLogTags.logtags文件中。
(1) 进程启动时的日志
# Application process has been started
30014 am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)
(2) system_server端与Activity相关的日志
# An activity is being finished:
30001 wm_finish_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3),(Reason|3)
# A new activity is being created in an existing task:
30005 wm_create_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5)
# An activity has been resumed into the foreground but was not already running:
30006 wm_restart_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3)
# An activity has been resumed and is now in the foreground:
30007 wm_resume_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3)
# Attempting to pause the current activity
30013 wm_pause_activity (User|1|5),(Token|1|5),(Component Name|3),(User Leaving|3)
# An activity is being destroyed:
30018 wm_destroy_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3),(Reason|3)
# Activity set to resumed
30043 wm_set_resumed_activity (User|1|5),(Component Name|3),(Reason|3)
# An activity been add into stopping list
30066 wm_add_to_stopping (User|1|5),(Token|1|5),(Component Name|3),(Reason|3)
(3) APP端与Activity相关的日志
# The activity's onPause has been called.
30021 wm_on_paused_called (Token|1|5),(Component Name|3),(Reason|3),(Time|1|3)
# The activity's onResume has been called.
30022 wm_on_resume_called (Token|1|5),(Component Name|3),(Reason|3),(Time|1|3)
# The activity's onStop has been called.
30049 wm_on_stop_called (Token|1|5),(Component Name|3),(Reason|3),(Time|1|3)
# The activity's onCreate has been called.
30057 wm_on_create_called (Token|1|5),(Component Name|3),(Reason|3),(Time|1|3)
# The activity's onRestart has been called.
30058 wm_on_restart_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onStart has been called.
30059 wm_on_start_called (Token|1|5),(Component Name|3),(Reason|3),(Time|1|3)
部分机型的日志在Reason后没有Time信息。Time表示耗时,单位为ms。如果耗时过长通常为APP的问题。
(4) 与焦点相关的日志
62000 input_interaction (windows|4)
62001 input_focus (window|3),(reason|3)
# The activity's onTopResumedActivityChanged(true) has been called.
30064 wm_on_top_resumed_gained_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onTopResumedActivityChanged(false) has been called.
30065 wm_on_top_resumed_lost_called (Token|1|5),(Component Name|3),(Reason|3)
常用日志命令
# 查看指定缓冲区日志并按关键字过滤
adb logcat -b main,system,events|grep -E "wm_| input_"
adb logcat -b main,system,events|grep -E "ActivityTaskManager|ActivityManager|wm_| input_"
# 清除所有缓冲区
adb logcat -c -b main,system,radio,events,crash,kernel
Activity生命周期日志
在DemoApp的MainActivity下点击Next Activity,于是退出MainActivity。但MainActivity仍然在任务栈中,只是不可见(不在栈顶),执行了onStop()。
包括APP上划返回桌面等导致Activity不可见的操作,其日志都类似。只不过部分操作的reason不一样。
(1) system_server
12-10 19:27:30.515 1798 2603 I wm_pause_activity: [0,163562355,com.demoapp.activitydemo/.MainActivity,userLeaving=true,resumeTopActivityInnerLocked]
12-10 19:27:30.524 1798 2603 I wm_add_to_stopping: [0,163562355,com.demoapp.activitydemo/.MainActivity,makeInvisible]
12-10 19:27:31.113 1798 1938 I wm_stop_activity: [0,163562355,com.demoapp.activitydemo/.MainActivity]
1798为system_server的PID;
TID=2603为Binder线程;
TID=1938的线程名为“android.display”;
(2) APP
12-10 19:27:30.522 27209 27209 I wm_on_paused_called: [0,com.demoapp.activitydemo.MainActivity,performPause,0]
12-10 19:27:31.140 27209 27209 I wm_on_stop_called: [0,com.demoapp.activitydemo.MainActivity,STOP_ACTIVITY_ITEM,0]
Activity不可见但未销毁,只执行onPaused()与onStop()。
进入Activity(执行onCreate)
system_server、APP端及焦点日志与启动根Activity的日志基本一致。
(1) system_server
main log:
12-10 19:27:30.505 1798 2603 I ActivityTaskManager: START u0 {cmp=com.demoapp.activitydemo/.SecondActivity} from uid 10253
event log:
12-10 19:27:30.513 1798 2603 I wm_create_activity: [0,183645801,34,com.demoapp.activitydemo/.SecondActivity,NULL,NULL,NULL,0]
12-10 19:27:30.525 1798 2603 I wm_restart_activity: [0,183645801,34,com.demoapp.activitydemo/.SecondActivity]
12-10 19:27:30.526 1798 2603 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.SecondActivity,minimalResumeActivityLocked]
TID=2603为Binder线程;
(2) APP
12-10 19:27:30.555 27209 27209 I wm_on_create_called: [0,com.demoapp.activitydemo.SecondActivity,performCreate,20]
12-10 19:27:30.558 27209 27209 I wm_on_start_called: [0,com.demoapp.activitydemo.SecondActivity,handleStartActivity,1]
12-10 19:27:30.560 27209 27209 I wm_on_resume_called: [0,com.demoapp.activitydemo.SecondActivity,RESUME_ACTIVITY,1]
(3) 焦点变化
12-10 19:27:30.521 27209 27209 I wm_on_top_resumed_lost_called: [163562355,com.demoapp.activitydemo.MainActivity,topStateChangedWhenResumed]
12-10 19:27:30.558 1798 2636 I input_focus: [Focus leaving 9ff2295 com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity (server),reason=NO_WINDOW]
12-10 19:27:30.565 27209 27209 I wm_on_top_resumed_gained_called: [183645801,com.demoapp.activitydemo.SecondActivity,topStateChangedWhenResumed]
12-10 19:27:30.578 1798 1939 I input_focus: [Focus request deed025 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity,reason=UpdateInputWindows]
12-10 19:27:30.610 1798 2636 I input_focus: [Focus entering deed025 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity (server),reason=Window became focusable. Previous reason: NOT_VISIBLE]
12-10 19:27:44.469 1798 2636 I input_interaction: Interaction with: deed025 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity (server), miui-gesture (server), PointerEventDispatcher0 (server),
退出Activity(执行onDestroy)
在SecondActivity中点击返回键,界面退回到MainActivity。而SecondActivity会从任务栈中移除,因此会执行onDestroy()。
(1) system_server
12-10 19:27:48.780 1798 4808 I wm_finish_activity: [0,183645801,34,com.demoapp.activitydemo/.SecondActivity,app-request]
12-10 19:27:48.791 1798 4808 I wm_pause_activity: [0,183645801,com.demoapp.activitydemo/.SecondActivity,userLeaving=false,finish]
12-10 19:27:48.798 1798 4807 I wm_add_to_stopping: [0,183645801,com.demoapp.activitydemo/.SecondActivity,completeFinishing]
12-10 19:27:49.341 1798 1938 I wm_destroy_activity: [0,183645801,34,com.demoapp.activitydemo/.SecondActivity,finish-imm:idle]
(2) APP
12-10 19:27:48.798 27209 27209 I wm_on_paused_called: [0,com.demoapp.activitydemo.SecondActivity,performPause,0]
12-10 19:27:49.366 27209 27209 I wm_on_stop_called: [0,com.demoapp.activitydemo.SecondActivity,LIFECYCLER_STOP_ACTIVITY,0]
12-10 19:27:49.367 27209 27209 I wm_on_destroy_called: [0,com.demoapp.activitydemo.SecondActivity,performDestroy,0]
进入Activity(执行onRestart)
Activity在之前已经Create,使其变得可见。包括以下情况:
- 不可见后,通过上划多任务界面进入Activity;
- 通过返回键返回到该Activity;
(1) system_server
12-14 14:15:01.927 1798 2602 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.MainActivity,moveTaskToFront findTaskToMoveToFront]
12-14 14:15:01.944 1798 5554 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.MainActivity,resumeTopActivityInnerLocked]
12-14 14:15:01.946 1798 5554 I wm_resume_activity: [0,250877008,48,com.demoapp.activitydemo/.MainActivity]
(2) APP
12-14 14:15:01.968 24827 24827 I wm_on_restart_called: [0,com.demoapp.activitydemo.MainActivity,performRestartActivity,0]
12-14 14:15:01.969 24827 24827 I wm_on_start_called: [0,com.demoapp.activitydemo.MainActivity,handleStartActivity,0]
12-14 14:15:01.972 24827 24827 I wm_on_resume_called: [0,com.demoapp.activitydemo.MainActivity,RESUME_ACTIVITY,1]
(3) 焦点
12-14 14:15:01.972 24827 24827 I wm_on_top_resumed_gained_called: [250877008,com.demoapp.activitydemo.MainActivity,topWhenResuming]
#焦点离开桌面
12-14 14:15:01.973 1798 2636 I input_focus: [Focus leaving 991afce com.miui.home/com.miui.home.launcher.Launcher (server),reason=NO_WINDOW]
#焦点请求并进入Activity
12-14 14:15:01.979 1798 1939 I input_focus: [Focus request 3758862 com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity,reason=UpdateInputWindows]
12-14 14:15:02.006 1798 2636 I input_focus: [Focus entering 3758862 com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity (server),reason=setFocusedWindow]
进入Activity(执行onResume)
Activity上覆盖了一个半透明的Activity,半透明的Activity消失以后,原Activity的生命周期变化如下。
(1) system_server
01-23 16:53:14.934 2249 3575 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.MainActivity,resumeTopActivityInnerLocked]
01-23 16:53:14.943 2249 3575 I wm_resume_activity: [0,122455594,28,com.demoapp.activitydemo/.MainActivity]
(2) APP
01-23 16:53:14.976 17131 17131 I wm_on_resume_called: [0,com.demoapp.activitydemo.MainActivity,RESUME_ACTIVITY,3]
(3) 焦点变化
01-23 16:53:14.974 2249 2546 I input_focus: [Focus leaving 50db9e com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity (server),reason=NO_WINDOW]
01-23 16:53:14.977 17131 17131 I wm_on_top_resumed_gained_called: [122455594,com.demoapp.activitydemo.MainActivity,topWhenResuming]
01-23 16:53:14.979 2249 2421 I input_focus: [Focus request c971c18 com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity,reason=UpdateInputWindows]
01-23 16:53:14.991 2249 3575 I input_focus: [At display :0,Ignore setInputWindows Focus :50db9e com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity,reason = NO_WINDOW]
01-23 16:53:15.009 2249 2546 I input_focus: [Focus entering c971c18 com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity (server),reason=setFocusedWindow]
Activity之间切换
startActivity()—当前Activity中创建
Base on: Android 12
在MainActivity调用startActivity(intent)跳转到SecondActivity
startActivity(new Intent(this, SecondActivity.class));
- MainActivity执行onStop生命周期
- SecondActivity执行onCreate生命周期
# START u0日志
05-07 18:05:08.615 1619 5707 I ActivityTaskManager: START u0 {cmp=com.demoapp.activitydemo/.SecondActivity} from uid 10230
# 两个Activity的跳转日志,红色表示MainActivity
05-07 18:05:08.625 1619 5707 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.MainActivity,positionChildAt]
05-07 18:05:08.625 1619 5707 I wm_create_activity: [0,65971905,89,com.demoapp.activitydemo/.SecondActivity,NULL,NULL,NULL,0]
05-07 18:05:08.628 1619 5707 I wm_pause_activity: [0,159911442,com.demoapp.activitydemo/.MainActivity,userLeaving=true,resumeTopActivity]
05-07 18:05:08.633 27073 27073 I wm_on_paused_called: [0,com.demoapp.activitydemo.MainActivity,performPause,0]
05-07 18:05:08.634 1619 5707 I wm_add_to_stopping: [0,159911442,com.demoapp.activitydemo/.MainActivity,makeInvisible]
05-07 18:05:08.635 1619 5707 I wm_restart_activity: [0,65971905,89,com.demoapp.activitydemo/.SecondActivity]
05-07 18:05:08.637 1619 5707 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.SecondActivity,minimalResumeActivityLocked]
05-07 18:05:08.654 27073 27073 I wm_on_create_called: [0,com.demoapp.activitydemo.SecondActivity,performCreate,9]
05-07 18:05:08.656 27073 27073 I wm_on_start_called: [0,com.demoapp.activitydemo.SecondActivity,handleStartActivity,0]
05-07 18:05:08.657 27073 27073 I wm_on_resume_called: [0,com.demoapp.activitydemo.SecondActivity,RESUME_ACTIVITY,1]
05-07 18:05:09.195 1619 2043 I wm_stop_activity: [0,159911442,com.demoapp.activitydemo/.MainActivity]
05-07 18:05:09.206 27073 27073 I wm_on_stop_called: [0,com.demoapp.activitydemo.MainActivity,STOP_ACTIVITY_ITEM,0]
注:非本进程的Activity启动另一个Activity,不会打印第一个wm_set_resumed_activity日志。
# 焦点的变化
05-07 18:05:08.632 27073 27073 I wm_on_top_resumed_lost_called: [159911442,com.demoapp.activitydemo.MainActivity,topStateChangedWhenResumed]
05-07 18:05:08.650 1619 2692 I input_focus: [Focus leaving 4c65e6c com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity (server),reason=NO_WINDOW]
05-07 18:05:08.663 27073 27073 I wm_on_top_resumed_gained_called: [65971905,com.demoapp.activitydemo.SecondActivity,topStateChangedWhenResumed]
05-07 18:05:08.671 1619 2044 I input_focus: [Focus request 6cf9af2 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity,reason=UpdateInputWindows]
05-07 18:05:08.675 1619 6534 I input_focus: [Focus receive :6cf9af2 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity,reason=setFocusedWindow]
05-07 18:05:08.692 1619 2692 I input_focus: [Focus entering 6cf9af2 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity (server),reason=Window became focusable. Previous reason: NOT_VISIBLE]
onDestroy()—返回到上一个Activity
从SecondActivity中点击返回,回到MainActivity
- SecondActivity执行onDestroy生命周期
- MainActivity执行onRestart生命周期
# 两个Activity的跳转日志,红色表示MainActivity
05-07 18:20:31.900 1619 2638 I wm_finish_activity: [0,65971905,89,com.demoapp.activitydemo/.SecondActivity,app-request]
05-07 18:20:31.908 1619 2638 I wm_pause_activity: [0,65971905,com.demoapp.activitydemo/.SecondActivity,userLeaving=false,finish]
05-07 18:20:31.912 27073 27073 I wm_on_paused_called: [0,com.demoapp.activitydemo.SecondActivity,performPause,1]
05-07 18:20:31.913 1619 2638 I wm_add_to_stopping: [0,65971905,com.demoapp.activitydemo/.SecondActivity,completeFinishing]
05-07 18:20:31.916 1619 2638 I wm_set_resumed_activity: [0,com.demoapp.activitydemo/.MainActivity,resumeTopActivity]
05-07 18:20:31.919 1619 2638 I wm_resume_activity: [0,159911442,89,com.demoapp.activitydemo/.MainActivity]
05-07 18:20:31.924 27073 27073 I wm_on_restart_called: [0,com.demoapp.activitydemo.MainActivity,performRestartActivity,0]
05-07 18:20:31.924 27073 27073 I wm_on_start_called: [0,com.demoapp.activitydemo.MainActivity,handleStartActivity,0]
05-07 18:20:31.925 27073 27073 I wm_on_resume_called: [0,com.demoapp.activitydemo.MainActivity,RESUME_ACTIVITY,1]
05-07 18:20:32.459 1619 2043 I wm_destroy_activity: [0,65971905,89,com.demoapp.activitydemo/.SecondActivity,finish-imm:idle]
05-07 18:20:32.469 27073 27073 I wm_on_stop_called: [0,com.demoapp.activitydemo.SecondActivity,LIFECYCLER_STOP_ACTIVITY,0]
05-07 18:20:32.469 27073 27073 I wm_on_destroy_called: [0,com.demoapp.activitydemo.SecondActivity,performDestroy,0]
# 焦点的变化
05-07 18:20:31.910 27073 27073 I wm_on_top_resumed_lost_called: [65971905,com.demoapp.activitydemo.SecondActivity,topStateChangedWhenResumed]
05-07 18:20:31.915 1619 2638 I input_focus: displayId :0, foucsApplication has changed to ActivityRecord{9880e12 u0 com.demoapp.activitydemo/.MainActivity t89}
05-07 18:20:31.925 27073 27073 I wm_on_top_resumed_gained_called: [159911442,com.demoapp.activitydemo.MainActivity,topWhenResuming]
05-07 18:20:31.927 1619 2692 I input_focus: [Focus leaving 6cf9af2 com.demoapp.activitydemo/com.demoapp.activitydemo.SecondActivity (server),reason=NO_WINDOW]
05-07 18:20:31.939 1619 2044 I input_focus: [Focus request 4c65e6c com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity,reason=UpdateInputWindows]
05-07 18:20:31.944 1619 6534 I input_focus: [Focus receive :4c65e6c com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity,reason=setFocusedWindow]
05-07 18:20:31.961 1619 2692 I input_focus: [Focus entering 4c65e6c com.demoapp.activitydemo/com.demoapp.activitydemo.MainActivity (server),reason=Window became focusable. Previous reason: NOT_VISIBLE]