huang1165441461 发表于 2019-3-28 11:20:34

安卓8.1源码桌面NavBar的电源按钮事件触发流程


### 桌面NavBar的电源按钮事件触发流程
在systemui中,frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java中的poweroffClick方法中发送Intent.ACTION_SYSTEMUI_FIREFLY_POWEROFF广播
```
private void poweroffClick(View v) {
      Intent intent=new Intent(Intent.ACTION_SYSTEMUI_FIREFLY_POWEROFF);
      getContext().sendBroadcast(intent);
    }
```

PhoneWindowManager接收广播调用showGlobalActionsInternal()方法
```
void showGlobalActionsInternal() {
      sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
      if (mGlobalActions == null) {
            mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);
      }
      final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();
      mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());
      if (keyguardShowing) {
            // since it took two seconds of long press to bring this up,
            // poke the wake lock so they have some time to see the dialog.
            mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
      }
    }

```
PowerManager
```
public void userActivity(long when, int event, int flags) {
      try {
            mService.userActivity(when, event, flags);
      } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
      }
    }

```
PowerManagerService
```
@Override // Binder call
      public void userActivity(long eventTime, int event, int flags) {
            final long now = SystemClock.uptimeMillis();
            if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER)
                  != PackageManager.PERMISSION_GRANTED
                  && mContext.checkCallingOrSelfPermission(
                            android.Manifest.permission.USER_ACTIVITY)
                            != PackageManager.PERMISSION_GRANTED) {
                // Once upon a time applications could call userActivity().
                // Now we require the DEVICE_POWER permission.Log a warning and ignore the
                // request instead of throwing a SecurityException so we don't break old apps.
                synchronized (mLock) {
                  if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) {
                        mLastWarningAboutUserActivityPermission = now;
                        Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the "
                              + "caller does not have DEVICE_POWER or USER_ACTIVITY "
                              + "permission.Please fix your app!"
                              + " pid=" + Binder.getCallingPid()
                              + " uid=" + Binder.getCallingUid());
                  }
                }
                return;
            }

            if (eventTime > now) {
                throw new IllegalArgumentException("event time must not be in the future");
            }

            final int uid = Binder.getCallingUid();
            final long ident = Binder.clearCallingIdentity();
            try {
                userActivityInternal(eventTime, event, flags, uid);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }
      }
```

Yzh 发表于 2019-3-30 14:21:15

{:4_122:}
页: [1]
查看完整版本: 安卓8.1源码桌面NavBar的电源按钮事件触发流程