可以理解android系统本身就是一个大的apk,而launcher,设置等apk就是这个大的apk中的某个模块的功能,各个功能模块各司其职,实现各自的功能
    那系统这个大的apk来如何解耦了,原生android系统功能最多的apk就是设置,设置基本上涵盖了所有常用的功能模块,以下以8.0设置中的休眠功能为例来说明,入口是在设置中设置休眠时间,然后具体逻辑功能实现是在framework中

packages\apps\Settings\src\com\android\settings\display\TimeoutPreferenceController.java

@Override    public boolean onPreferenceChange(Preference preference, Object newValue) {        try {            int value = Integer.parseInt((String) newValue);            Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT,                          value);            updateTimeoutPreferenceDescription((TimeoutListPreference) preference, value);        } catch (NumberFormatException e) {            Log.e(TAG, "could not persist screen timeout setting", e);        }        return true;    }

  frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java

    public void systemReady(IAppOpsService appOps) {        ...        mSettingsObserver = new SettingsObserver(mHandler);        ...        resolver.registerContentObserver(Settings.System.getUriFor(            Settings.System.SCREEN_OFF_TIMEOUT),            false, mSettingsObserver, UserHandle.USER_ALL);        ...    }    private final class SettingsObserver extends ContentObserver {        public SettingsObserver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange, Uri uri) {            synchronized (mLock) {                handleSettingsChangedLocked();            }    }        private void handleSettingsChangedLocked() {        updateSettingsLocked();        updatePowerStateLocked();    }    private void updatePowerStateLocked() {        ...        updateUserActivitySummaryLocked(now, dirtyPhase1);        ...    }    private void updateUserActivitySummaryLocked(long now, int dirty) {        // Update the status of the user activity timeout timer.        if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY                | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {            mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);              long nextTimeout = 0;            if (mWakefulness == WAKEFULNESS_AWAKE                    || mWakefulness == WAKEFULNESS_DREAMING                    || mWakefulness == WAKEFULNESS_DOZING) {                final int sleepTimeout = getSleepTimeoutLocked();                final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);                final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);                final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;                  mUserActivitySummary = 0;                if (mLastUserActivityTime >= mLastWakeTime) {                    nextTimeout = mLastUserActivityTime                            + screenOffTimeout - screenDimDuration;                    if (now < nextTimeout) {                        mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;                    } else {                        nextTimeout = mLastUserActivityTime + screenOffTimeout;                        if (now < nextTimeout) {                            mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;                        }                    }                }                if (mUserActivitySummary == 0                        && mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {                    nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;                    if (now < nextTimeout) {                        if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT) {                            mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;                        } else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {                            mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;                        }                    }                }                  if (mUserActivitySummary == 0) {                    if (sleepTimeout >= 0) {                        final long anyUserActivity = Math.max(mLastUserActivityTime,                                mLastUserActivityTimeNoChangeLights);                        if (anyUserActivity >= mLastWakeTime) {                            nextTimeout = anyUserActivity + sleepTimeout;                            if (now < nextTimeout) {                                mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;                            }                        }                    } else {                        mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;                        nextTimeout = -1;                    }                }                  if (mUserActivitySummary != USER_ACTIVITY_SCREEN_DREAM && userInactiveOverride) {                    if ((mUserActivitySummary &                            (USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0) {                        // Device is being kept awake by recent user activity                        if (nextTimeout >= now && mOverriddenTimeout == -1) {                            // Save when the next timeout would have occurred                            mOverriddenTimeout = nextTimeout;                        }                    }                    mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;                    nextTimeout = -1;                }                  if (mUserActivitySummary != 0 && nextTimeout >= 0) {                    Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);                    msg.setAsynchronous(true);                    mHandler.sendMessageAtTime(msg, nextTimeout);                }            } else {                mUserActivitySummary = 0;            }              if (DEBUG_SPEW) {                Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness="                        + PowerManagerInternal.wakefulnessToString(mWakefulness)                        + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)                        + ", nextTimeout=" + TimeUtils.formatUptime(nextTimeout));            }        }    }

    由以上源码可知其实设置只做了UI部分,然后功能部分是通过往数据库中设置一个了数值,具体实现是在PowerManagerService中实现,PowerManagerService中注册了数据变化的监听器,当数据变化时在onchange的时候去处理相关的逻辑,其实系统设置里面的很多功能都是通过类似的方式去实现,比如亮度,usbdebug开关等等很多实现都是这种方式,然后系统各大服务,各司其职去实现具体的功能逻辑,wifi服务就处理wifi相关的逻辑,蓝牙服务器就处理蓝牙相关的逻辑,电源管理服务就处理休眠/亮屏等逻辑,存储类的服务就处理存储类的逻辑等,系统数据库的管理在settingprovider中管理

更多相关文章

  1. Android(安卓)Notification自定义通知样式你要知道的事(android 8
  2. Android中Webview使用自定义的javascript进行回调
  3. Android中使用网络定位需要的设置
  4. Android开源计划-一周开发app
  5. 刘海屏适配总结
  6. 在Android(安卓)P版本中加入Face Unlock相关功能的讲解
  7. Android(安卓)android:windowSoftInputMode 属性整理
  8. Android系统移植与调试之------->如何修改Android默认字体大小和
  9. React Native 中的状态栏(Android沉浸式)

随机推荐

  1. Android(安卓)Weekly Notes Issue #241
  2. Android和H5交互一篇就够了
  3. Android提高篇之自定义dialog实现process
  4. Android使用Gradle依赖配置compile、impl
  5. LibGDX学习-LibGDX基本框架
  6. Android(安卓)屏幕旋转问题
  7. Android启动后,加载的2类service (Native
  8. Delphi10.2.3部署Android
  9. Android自适应屏幕方向、大小和分辨率,及
  10. Android裡使用的dpi 跟 pixel 的轉換