Android PowerManager 之启动
2016-10-11 20:15
183 查看
综述
启动
使用SystemServiceManager这个工厂类来启动PowreManagerService
看下SystemServiceManager.java中的具体实现
总结:PowerManagerService会在SystemServer中被启动。在SystemServiceManager中会调用PowerManagerService的构造函数及其onStart方法
在启动过程中会创建Notifier对象,主要作用是来发出各种同Power相关的通知,并和Battery的相关信息进行交互。当然在此过程中还有很多的更新参数、读取参数等等不再一一列出,代码一看就能够明白。较为详细的可以参照如下时序图。
下一篇介绍下WakeLock.acquire()的相关流程
启动
综述
在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 开发一个Activity 启动另一个Activity碰到的一个问题
- Android 实例-个人理财工具 之一 启动界面实现
- 分析Android 根文件系统启动过程(init守护进程分析)
- android 1.5 SDK 模拟器无法启动问题 “Failed to find an AVD mpatible with target”错误
- Android init 启动过程分析
- android 启动流程
- 定制android启动界面
- Android-1.5r3无法启动的问题
- [zz] 分析Android 根文件系统启动过程(init守护进程分析)
- Android 实例-个人理财工具 之二 启动时初始化数据
- Android应用程序快速启动的秘诀
- Android adb shell 启动java程序
- Android 实例-个人理财工具 之一 启动界面实现
- 分析Android 根文件系统启动过程(init守护进程分析)
- android上怎样让一个Service开机自动启动
- 关于Android的模拟器不能正常启动的解决方法
- 分析Android 根文件系统启动过程(init守护进程分析)
- Android init 启动过程分析
- Android init 启动过程分析
- 分析Android 根文件系统启动过程(init守护进程分析)