android分屏底层实现,Android 7.0分屏原理及生命周期
android分屏底层实现,Android 7.0分屏原理及生命周期
7.0分屏原理7.0的Activity新增了onMultiWindowModeChanged方法,当页面在分屏或不分屏状态变换时,会回调这个方法。分屏的任务管理器和虚拟按键在com/Android/systemui目录下。长按多任务键时会调用PhoneStatusBar的toggleSplitScreenMode()方法。需要说明的是,多任务界面实际上是一个名叫RecentsActivity的Activity。protected void toggleSplitScreenMode(int metricsDockAction, int metricsUndockAction)
{
if (mRecents == null) {
return;
}
int dockSide = WindowManagerProxy.getInstance().getDockSide();
if (dockSide == WindowManager.DOCKED_IVALID) {
//进入分屏模式,调出最近任务页面。
mRecents.dockTopTask(avigationBarGestureHelper.DRAG_MODE_OE,
ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT, null, metricsDockAction);
} else {
EventBus.getDefault().send(new UndockingTaskEvent());
if (metricsUndockAction != -1) {
MetricsLogger.action(mContext, metricsUndockAction);
}
}
需要分屏时会调用Recents的dockTopTask方法,该方法内部会调用RecentsImpl的dockTopTask,该方法除了在多任务界面做出任务管理“样式”的调整以外,还会调用,在分屏模式下打开最近任务
public void dockTopTask(int topTaskId, int dragMode,
int stackCreateMode, Rect initialBounds) {
SystemServicesProxy ssp = Recents.getSystemServices();
// Make sure we inform DividerView before we actually start the activity so we can change
// the resize mode already.
if ((topTaskId, stackCreateMode, initialBounds)) {//远程调用方法
EventBus.getDefault().send(new DockedTopTaskEvent(dragMode, initialBounds));
showRecents(
false /* triggeredFromAltTab */,
dragMode == avigationBarGestureHelper.DRAG_MODE_RECETS,
false /* animate */,
true /* launchedWhileDockingTask*/,
false /* fromHome */,
DividerView.IVALID_RECETS_GROW_TARGET);
}}
而该进程下的RecentsActivity则负责远程与PackageManager通信,拿到应用截图,添加到界面上
private void reloadStackView() {
//省略部分代码
RecentsTaskLoadPlan.Opti loadOpts = new RecentsTaskLoadPlan.Opti();
loadOpts.runningTaskId = launchState.launchedToTaskId;
= launchState.launchedumVisibleTasks;
= launchState.launchedumVisibleThumbnails;
loader.loadTasks(this, loadPlan, loadOpts);
TaskStack stack = loadPlan.getTaskStack();
(mIsVisible, stack.getTaskCount() == 0);
mRecentsView.updateStack(stack, true /* setStackViewTasks */);
// Update the nav bar scrim, but defer the animation until the enter-window event
boolean animateavBarScrim = !launchState.launchedViaDockGesture;
mScrimViews.updateavBarScrim(animateavBarScrim, stack.getTaskCount() > 0, null);
//省略部分代码
}
那么7.0的Activity新增的方法onMultiWindowModeChanged是在什么时候调用的呢?回到刚才的,该方法会跨进程调用
public boolean moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate,
Rect initialBounds, boolean moveHomeStackFront) {
enforceCallingPermission(MAAGE_ACTIVITY_STACKS, moveTaskToDockedStack());
synchronized (this) {
long ident = ();
try {
if (DEBUG_STACK) Slog.d(TAG_STACK, moveTaskToDockedStack: moving task= taskId
to createMode= createMode toTop= toTop);
mWindowManager.setDockedStackCreateState(createMode, initialBounds);
final boolean moved = (
taskId, DOCKED_STACK_ID, toTop, !FORCE_FOCUS, moveTaskToDockedStack,
animate, DEFER_RESUME);
if (moved) {
if (moveHomeStackFront) {
(moveTaskToDockedStack);
}
(null, 0, !PRESERVE_WIDOWS);
}
return moved;
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
该方法会调用,在StackSuperviso中做尺寸调整等工作以外,最终调用TaskRecord.updateOverrideConfiguration()。若需要分屏,则会调用scheduleReportMultiWindowModeChanged方法
Configuration updateOverrideConfiguration(Rect bounds, @ullable Rect insetBounds) {
//省略部分代码
if (mFullscreen != oldFullscreen) {
scheduleReportMultiWindowModeChanged(this);
}
return !(oldConfig) ? mOverrideConfig : null;
}
scheduleReportMultiWindowModeChanged最终调用ActivityThreadhandleMultiWindowModeChanged,并通过appToken到需要回调的Activityprivate void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode) {
final ActivityClientRecord r = mActivities.get(token);
if (r != null) {
r.activity.dispatchMultiWindowModeChanged(isInMultiWindowMode);
}
}
Activity的dispatchMultiWindowModeChanged会回调onMultiWindowModeChanged,便可进行业务处理
分屏时Activity的生命周期分三种情况
当前显示自己的应用页面,长按多任务键时出现分屏onMultiWindowModeChanged(true)->onPause-onStop->onDestroy->onCreate->onStart- >onResume->onPause
分屏时长按多任务键,全屏显示自己的应用时onStop->onDestroy->onCreate->onStart->onResume>onPause>onMultiWindowModeChanged(false)->onResume
当前显示其他应用,按多任务键出现自己的应用时onMultiWindowModeChanged(true)->nDestroy->onCreate->onStart->onResume
转自:
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:tfidf代码整理及理解
下一篇:python实时播放音频和录音
推荐阅读
留言与评论(共有 18 条评论) |
本站网友 守护boss好看吗 | 1分钟前 发表 |
stack.getTaskCount() > 0 | |
本站网友 缠腰龙 | 16分钟前 发表 |
metricsUndockAction);}}需要分屏时会调用Recents的dockTopTask方法,该方法内部会调用RecentsImpl的dockTopTask,该方法除了在多任务界面做出任务管理“样式”的调整以外,还会调用,在分屏模式下打开最近任务public void dockTopTask(int topTaskId | |
本站网友 大连电影院 | 30分钟前 发表 |
stackCreateMode | |
本站网友 孕前准备 | 28分钟前 发表 |
but defer the animation until the enter-window eventboolean animateavBarScrim = !launchState.launchedViaDockGesture;mScrimViews.updateavBarScrim(animateavBarScrim | |
本站网友 二与一为三 | 13分钟前 发表 |
moveTaskToDockedStack | |
本站网友 西城时代 | 6分钟前 发表 |
Rect initialBounds) {SystemServicesProxy ssp = Recents.getSystemServices();// Make sure we inform DividerView before we actually start the activity so we can change// the resize mode already.if ((topTaskId | |
本站网友 购灵网 | 2分钟前 发表 |
protected void toggleSplitScreenMode(int metricsDockAction | |
本站网友 自贸区跨境通网站 | 15分钟前 发表 |
长按多任务键时会调用PhoneStatusBar的toggleSplitScreenMode()方法 | |
本站网友 形象设计班 | 18分钟前 发表 |
loadPlan | |
本站网友 安康二手房网 | 12分钟前 发表 |
长按多任务键时会调用PhoneStatusBar的toggleSplitScreenMode()方法 | |
本站网友 淮安租房信息 | 18分钟前 发表 |
int stackCreateMode | |
本站网友 神楽坂真冬 | 8分钟前 发表 |
长按多任务键时会调用PhoneStatusBar的toggleSplitScreenMode()方法 | |
本站网友 赣州楼盘网 | 7分钟前 发表 |
metricsUndockAction);}}需要分屏时会调用Recents的dockTopTask方法,该方法内部会调用RecentsImpl的dockTopTask,该方法除了在多任务界面做出任务管理“样式”的调整以外,还会调用,在分屏模式下打开最近任务public void dockTopTask(int topTaskId | |
本站网友 垂悬腹 | 19分钟前 发表 |
DEFER_RESUME);if (moved) {if (moveHomeStackFront) {(moveTaskToDockedStack);}(null | |
本站网友 山寨币 | 22分钟前 发表 |
长按多任务键时会调用PhoneStatusBar的toggleSplitScreenMode()方法 | |
本站网友 提价通知 | 7分钟前 发表 |
false /* animate */ | |
本站网友 孕妇奶粉哪种牌子好 | 20分钟前 发表 |
boolean animate |