您的位置:首页 > 移动开发 > Android开发

Android PowerManager 之启动

2016-10-11 20:15 183 查看
综述

启动

综述

Android PowerManager 之一 初识中介绍了PowerManager的一些简单的demo。这里简要介绍下PowerManager的启动过程

启动

PowerManagerService
是系统提供的用于管理设备电源的一套服务,在
SystemServer
中被启动。如下面代码所示:

private void run() {
/*
* 初始化,申请内存,加载so。等等
*/
// Start services.
try {
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");
startBootstrapServices();//启动引导的相关Service
startCoreServices();//启动核心的Service
startOtherServices();//启动其他的一些必要的Service
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
// Loop forever.
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}


使用SystemServiceManager这个工厂类来启动PowreManagerService

private void startBootstrapServices() {

// Power manager needs to be started early because other services need it.
// Native daemons may be watching for it to be registered so it must be ready
// to handle incoming binder calls immediately (including being able to verify
// the permissions for those calls).
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
}


看下SystemServiceManager.java中的具体实现

/**
* Starts a service by class name.
*
* @return The service instance.
*/
@SuppressWarnings("unchecked")
public SystemService startService(String className) {
final Class<SystemService> serviceClass;
try {
serviceClass = (Class<SystemService>)Class.forName(className);
} catch (ClassNotFoundException ex) {
Slog.i(TAG, "Starting " + className);
//
}
return startService(serviceClass);
}

/**
* Creates and starts a system service. The class must be a subclass of
* {@link com.android.server.SystemService}.
*
* @param serviceClass A Java class that implements the SystemService interface.
* @return The service instance, never null.
* @throws RuntimeException if the service fails to start.
*/
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
// Create the service.
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
}
// Register it.
mServices.add(service);

// Start it.
try {
service.onStart();
}
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}


总结:PowerManagerService会在SystemServer中被启动。在SystemServiceManager中会调用PowerManagerService的构造函数及其onStart方法

public PowerManagerService(Context context) {
super(context);
mContext = context;
//创建HandlerThread,Handler并启动。
mHandlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());

synchronized (mLock) {
//创建一个WakeLock,一个Display的SuspendBlocker
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
mDisplaySuspendBlocker.acquire();
//......
//native的初始化。
nativeInit();
nativeSetAutoSuspend(false);
nativeSetInteractive(true);
nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);
}
}


@Override
public void onStart() {
//本别将 POWER_SERVICE 和 PowerManagerInternal暴露出去
publishBinderService(Context.POWER_SERVICE, new BinderService());
publishLocalService(PowerManagerInternal.class, new LocalService());
//设置看门狗
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}


@Override
public void systemReady(IAppOpsService appOps) {
synchronized (mLock) {
// The notifier runs on the system server's main looper so as not to interfere
// with the animations and other critical functions of the power manager.
mBatteryStats = BatteryStatsService.getService();
mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
mPolicy);

//注册一大堆的广播,一大堆的监听器
// Go.
readConfigurationLocked();
updateSettingsLocked();
mDirty |= DIRTY_BATTERY_STATE;
updatePowerStateLocked();
}
}


在启动过程中会创建Notifier对象,主要作用是来发出各种同Power相关的通知,并和Battery的相关信息进行交互。当然在此过程中还有很多的更新参数、读取参数等等不再一一列出,代码一看就能够明白。较为详细的可以参照如下时序图。



下一篇介绍下WakeLock.acquire()的相关流程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android power