Android应用开发android 关机流程详细分析
白羽 2019-03-12 来源 :网络 阅读 591 评论 0

摘要:本文将带你了解Android应用开发android 关机流程详细分析,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发android 关机流程详细分析,希望本文对大家学Android有所帮助。



Android应用开发android 关机流程详细分析


android   关机流程详细分析。前面有提到过android事件上报流程,InputReaderThread   从EventHub读到按键事件后,交给InputDispatcher 往上上报,我们从这里跟踪一下长按power键关键流程,
   
    frameworks/native/services/inputflinger/InputDispatcher.cpp
   
  
    void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
    …
    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/   policyFlags);
    …
    }
    这里的mPolicy是NativeInputManager对象.
   
    frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
   
   
    void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent*   keyEvent, uint32_t& policyFlags) {
    …
      jobject keyEventObj =   android_view_KeyEvent_fromNative(env, keyEvent);
    886          jint wmActions;
    887          if (keyEventObj) {
    888              wmActions =   env->CallIntMethod(mServiceObj,
    889                        gServiceClassInfo.interceptKeyBeforeQueueing,
    890                      keyEventObj,   policyFlags);
    891              if   (checkAndClearExceptionFromCallback(env, interceptKeyBeforeQueueing)) {
    892                  wmActions =   0;
    893              }
    894                android_view_KeyEvent_recycle(env, keyEventObj);
    895                env->DeleteLocalRef(keyEventObj);
    896          } else {
    897              ALOGE(Failed to   obtain key event object for interceptKeyBeforeQueueing.);
    898              wmActions = 0;
    899          }
    …
    }
    这里会call到java层,call 到InputManagerService里面。
      frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
   
 
    // Native callback.
    1871      private int   interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
    1872          return   mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);
 
    }
    这个mWindowManagerCallbacks 是通过下面的接口设置的。
   
   
    inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
    继续追查下去,就是一个InputMonitor 实例。
      frameworks/base/services/core/java/com/android/server/wm/InputMonitor.java
   
 
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)   {
         return   mService.mPolicy.interceptKeyBeforeQueueing(event, policyFlags);
     }
    这里的mService就是WindowManagerService。
   
    frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
 
    final WindowManagerPolicy mPolicy = new PhoneWindowManager();
    所以这个mPolicy就是PhoneWindowManager对象。
    frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
 
   
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)   {
     
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)   {
       case KeyEvent.KEYCODE_POWER:   {
    5815                  result &=   ~ACTION_PASS_TO_USER;
    5816                  isWakeKey =   false; // wake-up will be handled separately
    5817                  if (down)   {
    5818                        interceptPowerKeyDown(event, interactive);
    5819                  } else {
    5820                        interceptPowerKeyUp(event, interactive, canceled);
    5821                  }
    5822                  break;
    5823              }
    }
    继续走到interceptPowerKeyDown()函数里面。
  
    private void interceptPowerKeyDown(KeyEvent event, boolean interactive)   {

  
    ...
    if (interactive) {
    1087                  // When   interactive, we're already awake.
    1088                  // Wait for a   long press or for the button to be released to decide what to do.
    1089                  if   (hasLongPressOnPowerBehavior()) {
    1090                      Message msg   = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
    1091                        msg.setAsynchronous(true);
    1092                        mHandler.sendMessageDelayed(msg,
    1093                                ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
    1094                  }
    1095              }
  
    }
    这里面判断是长按power键后会发一个MSG_POWER_LONG_PRESS消息出来,我们看一下它的处理。
 
    private class PolicyHandler extends Handler {
    ...
    746          @Override
    747          public void   handleMessage(Message msg) {
    748              switch (msg.what)   {
      case MSG_POWER_LONG_PRESS:
    790                        powerLongPress();
    791                      break;
    }
    }
   

      private void powerLongPress()   {
    1255          final int behavior =   getResolvedLongPressOnPowerBehavior();
    1256          switch (behavior)   {
    1257          case   LONG_PRESS_POWER_NOTHING:
    1258              break;
    1259          case   LONG_PRESS_POWER_GLOBAL_ACTIONS:
    1260              mPowerKeyHandled =   true;
    1261              if (!performHapticFeedbackLw(null,   HapticFeedbackConstants.LONG_PRESS, false)) {
    1262                    performAuditoryFeedbackForAccessibilityIfNeed();
    1263              }
    1264                showGlobalActionsInternal();
    1265              break;
    1273          }
    1274      }
    接下来会走到showGlobalActionsInternal()函数里面。

      void showGlobalActionsInternal()   {
    1389            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
    1390          if (mGlobalActions ==   null) {
    1391              mGlobalActions =   new GlobalActions(mContext, mWindowManagerFuncs);
    1392          }
    1393          final boolean   keyguardShowing = isKeyguardShowingAndNotOccluded();
    1394            mGlobalActions.showDialog(keyguardShowing,   isDeviceProvisioned());
    1395          if (keyguardShowing)   {
    1396              // since it took   two seconds of long press to bring this up,
    1397              // poke the wake   lock so they have some time to see the dialog.
    1398                mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
    1399          }
    1400      }
    showDialog(keyguardShowing, isDeviceProvisioned());会弹出选择界面。
   
      frameworks/base/services/core/java/com/android/server/policy/GlobalActions.java

          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程