您现在的位置是:首页 > 数码 > 

android分屏底层实现,Android 7.0分屏原理及生命周期

2025-07-26 15:58:37
android分屏底层实现,Android 7.0分屏原理及生命周期 7.0分屏原理7.0的Activity新增了onMultiWindowModeChanged方法,当页面在分屏或不分屏状态变换时,会回调这个方法。分屏的任务管理器和虚拟按键在com/Android/systemui目录下。长按多任务键时会调用PhoneStatusBar的toggleSplitScr

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组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/857058.html

相关标签:无
上传时间: 2024-02-10 06:16:04
留言与评论(共有 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