摘要:本文将带你了解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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号