简述
DisplayManagerService
用来管理显示的生命周期,它决定如何根据当前连接的物理显示设备控制其逻辑显示,并且在状态更改时,向系统和应用程序发送通知,等等。一次多种显示类型的多显示器镜像显示,包括内建的显示类型(本地)、HDMI显示类型以及支持WIFI Display协议(MIRACAST),实现本地设备在远程显示器的镜像显示;
DisplayAdapter
是DisplayManagerService
所依赖的集合组件,其为系统显示,收集并发现物理显示设备提供了适配器的作用。
目前有以下两种方式的适配器供使用
- 一、为本地显示设备提供适配器。
- 二、为开发者提供的模拟显示适配器。
DisplayAdapter
与 DisplayManagerService
是弱耦合关系。DisplayAdapter
通过注册在 DisplayManagerService
类中的 DisplayAdapter.Listener
实现异步通信。
这样做有两个原因
- 一、巧妙地封装了这两个类的职责,
DisplayAdapter
:处理各个显示设备
DisplayManagerService
:处理全局显示状态。 - 二、消除异步显示设备发现导致死锁的可能性
Synchronization(同步锁)
因为显示管理器可能被多个线程访问,所以同步锁就会变得有点复杂。 特别是当窗口管理器( window manager
)在保持绘制事务的同时调用显示管理器(display manager
),窗口管理器期望它可以立即应用并更改。 但不幸的是,显示管理器(display manager
)不能异步地做所有事情。
为了解决这个问题,显示管理器的所有对象必须持有相同的锁。 我们将此锁称为同步锁,它具有唯一性。
通过DisplayManager提供对外接口
提供接口包括如下:
- 1.
getDisplay(int displayId)
根据displayId
参数获得一个逻辑显示器的信息 - 2.
getDisplays()
获得当前所有有效的逻辑显示器列表 - 3.
registerDisplayListener()
登记一个显示监听对象,用来监听显示器的新增、去除或改变通知事件。 - 4.
unregisterDisplayListener()
取消先前登记的一个显示监听对象 - 5.
createVirtualDisplay()
创建一个虚拟显示器,虚拟显示的内容被渲染到提供的Surface
中,当进程终止时虚拟显示器会被自动的释放,并且所有的Window都会被强制移除。当不再使用他时,你应该调用release()
方法来释放资源。
相关类
- 1.
DisplayPowerController
控制屏幕显示相关的电源状态,包括距离传感器和光线传感器等。 - 2.
DisplayPowerState
控制显示状态。当属性改变的时候,该组件以统一的顺序发生一个回调以应用这些改变。
一、初始化
跟其他系统服务一样, DisplayManagerService
也是继承于SystemService
并通过SystemServer
启动。
frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
private void startBootstrapServices() {
......
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
......
}
}
DisplayManagerService
继承 SystemService
, 由 SystemServer
启动。
构造函数
public final class DisplayManagerService extends SystemService {
...
public DisplayManagerService(Context context) {
this(context, new Injector());
}
@VisibleForTesting
DisplayManagerService(Context context, Injector injector) {
super(context);
mInjector = injector;
mContext = context;
//Step:1
mHandler = new DisplayManagerHandler(DisplayThread.get().getLooper());
mUiHandler = UiThread.getHandler();
//Step:2
mDisplayAdapterListener = new DisplayAdapterListener();
//Step:3
mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger(
com.android.internal.R.integer.config_defaultDisplayDefaultColorMode);
//Step:4
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting();
}
...
}
- 1.创建Handler接收消息并处理
- 2.创建适配器监听器,用于监听设备的添加、改变、异常
- 3.用于开发模式
- 4.获取电源管理
onStart方法
@Override
public void onStart() {
//Step 1
mPersistentDataStore.loadIfNeeded();
//Step 2
mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);
//Step 3
publishBinderService(Context.DISPLAY_SERVICE, new BinderService(),
true /*allowIsolated*/);
//Step 4
publishLocalService(DisplayManagerInternal.class, new LocalService());
//Step 5
publishLocalService(DisplayTransformManager.class, new DisplayTransformManager());
}
- 加载本地持久化数据
- 2.发送消息注册默认适配器
- 3.对其他
services
或者app应用
公开BinderService
AIDL远程服务 - 4.对系统进程公开
LocalService
和DisplayTransformManager
加载本地持久数据
/frameworks/base/services/core/java/com/android/server/display/PersistentDataStore.java
public void loadIfNeeded() {
if (!mLoaded) {
load();
mLoaded = true;
}
}
private void load() {
clearState();
final InputStream is;
try {
is = mAtomicFile.openRead();
} catch (FileNotFoundException ex) {
return;
}
XmlPullParser parser;
try {
parser = Xml.newPullParser();
parser.setInput(new BufferedInputStream(is), StandardCharsets.UTF_8.name());
loadFromXml(parser);
} catch (IOException ex) {
Slog.w(TAG, "Failed to load display manager persistent store data.", ex);
clearState();
} catch (XmlPullParserException ex) {
Slog.w(TAG, "Failed to load display manager persistent store data.", ex);
clearState();
} finally {
IoUtils.closeQuietly(is);
}
}
注册默认显示器
主要功能是将显示设备添加注册到mDisplayAdapters
集合中
private void registerDefaultDisplayAdapter() {
// Register default display adapter.
synchronized (mSyncRoot) {
registerDisplayAdapterLocked(new LocalDisplayAdapter(
mSyncRoot, mContext, mHandler, mDisplayAdapterListener));
}
}
private void registerDisplayAdapterLocked(DisplayAdapter adapter) {
mDisplayAdapters.add(adapter);
adapter.registerLocked();
}
onBootPhase()方法
等待默认显示器
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_WAIT_FOR_DEFAULT_DISPLAY) {
synchronized (mSyncRoot) {
long timeout = SystemClock.uptimeMillis() + WAIT_FOR_DEFAULT_DISPLAY_TIMEOUT;
while (mLogicalDisplays.get(Display.DEFAULT_DISPLAY) == null) {
......
try {
mSyncRoot.wait(delay);
} catch (InterruptedException ex) {
}
}
}
}
}
systemReady()方法
服务就绪
public void systemReady(boolean safeMode, boolean onlyCore) {
synchronized (mSyncRoot) {
mSafeMode = safeMode;
mOnlyCore = onlyCore;
}
//注册调价适配器类型
mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
}
private void registerAdditionalDisplayAdapters() {
synchronized (mSyncRoot) {
if (shouldRegisterNonEssentialDisplayAdaptersLocked()) {
//开发模式用
registerOverlayDisplayAdapterLocked();
//wifi 远程显示器用
registerWifiDisplayAdapterLocked();
//虚拟显示用
registerVirtualDisplayAdapterLocked();
}
}
}