android Back键处理流程及Log分析
Galley界面按返回整体流程:
- FWK响应back键,在PhoneWindowManager里面会拦截back键,然后通过binder调用ATMS的finishActivity方法
- 在finishActivityLocked里面,会先调整当前focus栈,寻找下一个focus,由于应用是从桌面启动的,下一个栈是Home所有的栈,满足条件,将Home栈移到顶部
- GalleryActivity 从RESUMED ==> PAUSING ==> PAUSED ==> STOPPING
- Launcher 状态从STOPPED ==> RESUMED,然后触发IDLE回收
- GalleryActivity 状态从STOPPING ==> FINISHING ==> DESTROYING ==> DESTROYED
- GalleryActivity 所有的栈被回收,从ActivityDisplay remove
1.PhoneWindowManager响应back键流程
08-22 18:41:32.383 1245 1435 D WindowManager: interceptKeyTq keycode=4 interactive=true keyguardActive=false policyFlags=2b000002
08-22 18:41:32.383 1245 1435 D WindowManager: java.lang.Throwable
08-22 18:41:32.383 1245 1435 D WindowManager: at com.android.server.policy.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:3693)
08-22 18:41:32.383 1245 1435 D WindowManager: at com.android.server.wm.InputManagerCallback.interceptKeyBeforeQueueing(InputManagerCallback.java:164)
08-22 18:41:32.383 1245 1435 D WindowManager: at com.android.server.input.InputManagerService.interceptKeyBeforeQueueing(InputManagerService.java:1852)
08-22 18:41:32.383 1245 1435 D WindowManager: at com.android.server.input.InputManagerService.nativeInjectInputEvent(Native Method)
08-22 18:41:32.383 1245 1435 D WindowManager: at com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:635)
08-22 18:41:32.383 1245 1435 D WindowManager: at com.android.server.input.InputManagerService.injectInputEvent(InputManagerService.java:617)
08-22 18:41:32.383 1245 1435 D WindowManager: at android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:392)
08-22 18:41:32.383 1245 1435 D WindowManager: at android.os.Binder.execTransactInternal(Binder.java:1021)
08-22 18:41:32.383 1245 1435 D WindowManager: at android.os.Binder.execTransact(Binder.java:994)
BACK键的定义:
/** Key code constant: Back key. */
public static final int KEYCODE_BACK = 4;
back键pressed打印
08-22 19:01:20.850 1315 1348 D AutofillManagerService: onBackKeyPressed()
2.在finishActivityLocked里面,会先调整当前focus栈,将Home栈移到顶部
requestFinishActivityLocked方法中,会打印调用的原因,reason=app-request
08-22 18:41:32.484 1245 1278 V ActivityTaskManager: Finishing activity token=Token{b411460 ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99}} r=, result=0, data=null, reason=app-request
08-22 18:41:32.485 1245 1278 D ActivityTaskManager: moveActivityStackToFront: activity=ActivityRecord{7f534c6 u0 com.android.launcher3/.Launcher t98}
08-22 18:41:32.487 1245 1278 V ActivityTaskManager: Sending position change to ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f}, onTop: false
重点看一下finishActivityLocked,在此方法中,调用了adjustFocusedActivityStack来调整focus栈。
ActivityRecord.moveFocusableActivityToTop,此方法会打印moveActivityStackToFront,此时将Launcher 所有的stack移动顶部
final boolean finishActivityLocked(ActivityRecord r, int resultCode, Intent resultData,String reason, boolean oomAdj, boolean pauseImmediately) {try {r.makeFinishingLocked();// 1.先在当前的TaskRecord里面找是否还有ActivityRecord,final TaskRecord task = r.getTaskRecord();task.taskId, r.shortComponentName, reason);final ArrayList<ActivityRecord> activities = task.mActivities;final int index = activities.indexOf(r);r.pauseKeyDispatchingLocked();// 2.调整焦点stack,adjustFocusedActivityStack(r, "finishActivity");// 3. Tell window manager to prepare for this one to be removed.r.setVisibility(false);
}
3.GalleryActivity 从RESUMED ==> PAUSING ==> PAUSED ==> STOPPING
GalleryActivity 状态 from:RESUMED to:PAUSING
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: State movement: ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f} from:RESUMED to:PAUSING reason:startPausingLocked
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: java.lang.Throwable
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at com.android.server.wm.ActivityStack.startPausingLocked(ActivityStack.java:1690)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at com.android.server.wm.ActivityStack.finishActivityLocked(ActivityStack.java:4046)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at com.android.server.wm.ActivityStack.finishActivityLocked(ActivityStack.java:3980)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at com.android.server.wm.ActivityStack.requestFinishActivityLocked(ActivityStack.java:3822)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at com.android.server.wm.ActivityTaskManagerService.finishActivity(ActivityTaskManagerService.java:1629)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1928)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at android.os.Binder.execTransactInternal(Binder.java:1021)
08-22 18:41:32.503 1245 1278 V ActivityTaskManager: at android.os.Binder.execTransact(Binder.java:994)
GalleryActivity 状态 from:PAUSING to:PAUSED
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: State movement: ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f} from:PAUSING to:PAUSED reason:completePausedLocked
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: java.lang.Throwable
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.completePauseLocked(ActivityStack.java:1801)
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.activityPausedLocked(ActivityStack.java:1770)
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityTaskManagerService.activityPaused(ActivityTaskManagerService.java:1714)
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1981)
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at android.os.Binder.execTransactInternal(Binder.java:1021)
08-22 18:41:32.531 1245 1435 V ActivityTaskManager: at android.os.Binder.execTransact(Binder.java:994)
在activityPausedLocked方法里面,
final void activityPausedLocked(IBinder token, boolean timeout) {if (DEBUG_PAUSE) Slog.v(TAG_PAUSE,"Activity paused: token=" + token + ", timeout=" + timeout);final ActivityRecord r = isInStackLocked(token);if (r != null) {mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);// 此时mPausingActivity == r,在调用completePauseLocked时传入参数resumeNext为trueif (mPausingActivity == r) {try {completePauseLocked(true /* resumeNext */, null /* resumingActivity */);} finally {mService.mWindowManager.continueSurfaceLayout();}}
4.Launcher 状态从STOPPED ==> RESUMED,然后触发IDLE回收
在finishActivityLocked方法里面,将Launcher所有的栈移到顶部,然后resumeTopActivityInnerLocked,将Launcher 状态从 from:STOPPED to:RESUMED
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: State movement: ActivityRecord{7f534c6 u0 com.android.launcher3/.Launcher t98} from:STOPPED to:RESUMED reason:resumeTopActivityInnerLocked
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: java.lang.Throwable
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2909)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2578)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.RootActivityContainer.resumeFocusedStacksTopActivities(RootActivityContainer.java:1159)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.completePauseLocked(ActivityStack.java:1843)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.activityPausedLocked(ActivityStack.java:1770)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityTaskManagerService.activityPaused(ActivityTaskManagerService.java:1714)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1981)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at android.os.Binder.execTransactInternal(Binder.java:1021)
08-22 18:41:32.537 1245 1435 V ActivityTaskManager: at android.os.Binder.execTransact(Binder.java:994)
08-22 19:01:20.885 2835 2835 V Activity: onPause com.android.gallery3d.app.GalleryActivity@1dab85a
08-22 19:01:20.898 2835 2835 D ActivityThread: setState newLifecycleState = 4
5.GalleryActivity 状态从STOPPING ==> FINISHING ==> DESTROYING ==> DESTROYED
GalleryActivity 状态from:PAUSED to:STOPPING
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: State movement: ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f} from:PAUSED to:STOPPING reason:finishCurrentActivityLocked
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: java.lang.Throwable
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:4125)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.completePauseLocked(ActivityStack.java:1804)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityStack.activityPausedLocked(ActivityStack.java:1770)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at com.android.server.wm.ActivityTaskManagerService.activityPaused(ActivityTaskManagerService.java:1714)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1981)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at android.os.Binder.execTransactInternal(Binder.java:1021)
08-22 18:41:32.532 1245 1435 V ActivityTaskManager: at android.os.Binder.execTransact(Binder.java:994)
/在resumeTopActivityInnerLocked方法里面,会通过ResumeActivityItem调用ActivityThread.handleResumeActivity方法,触发Looper.myQueue().addIdleHandler(new Idler()); 回收空闲的Activity
08-22 18:41:32.562 1245 1296 V ActivityTaskManager: Activity idle: null
08-22 18:41:32.562 1245 1296 D ActivityTaskManager: allResumedActivitiesIdle: stack=0 ActivityRecord{7f534c6 u0 com.android.launcher3/.Launcher t98} not idle
08-22 18:41:32.562 1245 1296 V ActivityTaskManager: Stopping ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f}: nowVisible=false animating=true finishing=true
在activityIdleInternalLocked方法,startActivityPausingLocked方法中,将activity加入stopping的队列中
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: State movement: ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f} from:STOPPING to:FINISHING reason:finishCurrentActivityLocked
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: java.lang.Throwable
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at com.android.server.wm.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:4138)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor.activityIdleInternalLocked(ActivityStackSupervisor.java:1354)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor$ActivityStackSupervisorHandler.activityIdleInternal(ActivityStackSupervisor.java:2602)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor$ActivityStackSupervisorHandler.handleMessage(ActivityStackSupervisor.java:2637)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at android.os.Handler.dispatchMessage(Handler.java:107)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at android.os.Looper.loop(Looper.java:214)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at android.os.HandlerThread.run(HandlerThread.java:67)
08-22 18:41:33.095 1245 1296 V ActivityTaskManager: at com.android.server.ServiceThread.run(ServiceThread.java:44)08-22 18:41:33.097 1245 1296 V ActivityTaskManager: State movement: ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f} from:FINISHING to:DESTROYING reason:destroyActivityLocked. finishing and not skipping destroy08-22 18:41:33.187 1245 1435 V ActivityTaskManager: State movement: ActivityRecord{8400448 u0 com.android.gallery3d/.app.GalleryActivity t99 f} from:DESTROYING to:DESTROYED reason:removeActivityFromHistoryLocked08-22 18:41:33.192 1245 1435 I ActivityTaskManager: removeTask: removing stack=ActivityStack{6940ec7 stackId=1 type=standard mode=fullscreen visible=false translucent=true, 0 tasks}
08-22 18:41:33.200 1245 1435 V ActivityTaskManager: removeChild: detaching ActivityStack{6940ec7 stackId=1 type=standard mode=fullscreen visible=false translucent=true, 0 tasks} from displayId=0
android Back键处理流程及Log分析相关推荐
- 高通语音专题--呼叫保持流程和日志分析
1 呼叫保持整体流程 以下是呼叫保持的整体流程图 前提条件:UE1 和 UE2 已经建立正常通话 2 呼叫保持流程及 log 分析 1 UI 向 QMI 发送 Hold Call 请求 关键 ...
- 高通语音专题---电话会议流程和日志分析
1 电话会议整体流程 以下呼叫流程和日志分析描述了UE中的呼叫会议过程 前提条件: UE1 保持 UE2 并与 UE3 通话. a 当 UE1 收到开始会议的请求时,它会将与 UE3 的当前通话置 ...
- android 通话的log分析,Android Telephony 接电话流程分析
写在前面的话 本文主要分析Android 接电话的流程,研究的代码是Android 4.4的,现在我们只关注framework层,以CDMA为例,GSM同理. 如果图片看不清的话,可以右键选择在新标签 ...
- c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...
在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...
- android power 按键,Android Framework层Power键关机流程(一,Power长按键操作处理)
一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...
- Android 手机灭屏流程分析详解
参考地址:https://www.jianshu.com/p/9241f3a91095 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: 1.前言 2.Pow ...
- android power键测试,Android Framework层Power键关机流程(一,Power长按键操作处理)...
一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...
- Android手机亮屏流程分析
极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能 注:文章转于网络,点击查看原文 PowerManagerService 之前系列文章 ...
- Android系统的启动流程简要分析
这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍. 一.Android系统的架构介绍 Android的整 ...
最新文章
- wpf Datagrid绑定 Dictionary
- iPhoneX快速适配,简单到你想哭。
- 某油企产成品标准成本估算逻辑
- 深入理解 x86/x64 的中断体系--IVT VS IDT
- php面向对象调用方法,在面向对象的php中调用方法
- github 开源项目 java_2019 年 GitHub 上最热门的 Java 开源项目
- /usr/bin/ld: 找不到 -lopencv_dep_cudart
- Maven学习(五)————依赖的特性辨析
- 错失黄金时期、连年亏损,国美App改名也难“真快乐”
- C#基础---Queue(队列)的应用
- LeetCode 234 Palindrome Linked List
- NSD cisco高级路由与交换技术--2014.8.16
- 五款app原型设计工具对比
- 远程桌面管理工具RDCMan
- 前期交互流程(PTES的第一步)
- testflight怎么做版本更新_TestFlight
- 配色(转http://huaban.com/boards/13532082/)
- 交通 流量 时间序列预测,神经网络 机器学习 BPNN
- JAVA POI WORD XWPFDocument 常用操作-随时更新
- 谷歌浏览器自动填充功能怎么开启?自动填充功能开启方法