当前位置: 首页 > news >正文

域名指向国外服务器做网站网站设计 三把火科技

域名指向国外服务器做网站,网站设计 三把火科技,html网页设计步骤,怎么做钓鱼网站吗该系列文章总纲链接#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 说明#xff1a; 说明#xff1a;本章节持续迭代之前章节的思维导图#xff0c;主要关注左侧上方锁屏分析部分 睡眠灭屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来完…该系列文章总纲链接专题分纲目录 Android SystemUI组件 本章关键点总结 说明 说明本章节持续迭代之前章节的思维导图主要关注左侧上方锁屏分析部分 睡眠灭屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来完成。想了解更多可参考输入子系统的相关文章。整理如下 Android Framework 输入子系统01核心机制 inotify和epoll Android Framework 输入子系统02核心机制 双向通信(socketpairbinder) Android Framework 输入子系统03输入系统框架 Android Framework 输入子系统04InputReader解读 Android Framework 输入子系统05InputDispatcher解读 Android Framework 输入子系统06Global Key 一键启动 应用程序案例 Android Framework 输入子系统07APP建立联系 Android Framework 输入子系统08View基础(activity window decor view) Android Framework 输入子系统09InputStage解读 Android Framework 输入子系统10Input命令解读 Android Framework 输入子系统11sendevent与getevent命令解读 本章我们只关注与Power按键相关的内容InputManagerService处理的按键事件最终会传递到PhoneWindowManager的interceptKeyBeforeQueueing方法中处理。我们就从这里入手逐步分析。 1 从PhoneWindowManager到PowerManagerService的处理 public class PhoneWindowManager implements WindowManagerPolicy {static final String TAG WindowManager;static final boolean DEBUG false;//...//关键流程step1public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {//...//表示屏幕是否点亮final boolean interactive (policyFlags FLAG_INTERACTIVE) ! 0;final boolean down event.getAction() KeyEvent.ACTION_DOWN;final boolean canceled event.isCanceled();//获取按键编码final int keyCode event.getKeyCode();final boolean keyguardActive (mKeyguardDelegate null ? false :(interactive ?isKeyguardShowingAndNotOccluded() :mKeyguardDelegate.isShowing()));boolean isWakeKey (policyFlags WindowManagerPolicy.FLAG_WAKE) ! 0|| event.isWakeKey();//...// Handle special keys.switch (keyCode) {//...case KeyEvent.KEYCODE_POWER: {result ~ACTION_PASS_TO_USER;isWakeKey false; // wake-up will be handled separatelyif (down) {//亮屏 step1 按下power按键亮屏流程interceptPowerKeyDown(event, interactive);} else {//抬起power按键interceptPowerKeyUp(event, interactive, canceled);}break;}case KeyEvent.KEYCODE_SLEEP: {result ~ACTION_PASS_TO_USER;if (!mPowerManager.isInteractive()) {useHapticFeedback false; // suppress feedback if already non-interactive}mPowerManager.goToSleep(event.getEventTime(),PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);isWakeKey false;break;}case KeyEvent.KEYCODE_WAKEUP: {result ~ACTION_PASS_TO_USER;isWakeKey true;break;}//...}//...if (isWakeKey) {wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey);}return result;}//...//关键流程step2private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) {final boolean handled canceled || mPowerKeyHandled;mScreenshotChordPowerKeyTriggered false;cancelPendingScreenshotChordAction();cancelPendingPowerKeyAction();if (!handled) {// Figure out how to handle the key now that it has been released.mPowerKeyPressCounter 1;final int maxCount getMaxMultiPressPowerCount();final long eventTime event.getDownTime();if (mPowerKeyPressCounter maxCount) {// This could be a multi-press. Wait a little bit longer to confirm.// Continue holding the wake lock.Message msg mHandler.obtainMessage(MSG_POWER_DELAYED_PRESS,interactive ? 1 : 0, mPowerKeyPressCounter, eventTime);msg.setAsynchronous(true);mHandler.sendMessageDelayed(msg, ViewConfiguration.getDoubleTapTimeout());return;}// No other actions. Handle it immediately.powerPress(eventTime, interactive, mPowerKeyPressCounter);}// Done. Reset our state.finishPowerKeyPress();}//...//关键流程step3private void powerPress(long eventTime, boolean interactive, int count) {if (mScreenOnEarly !mScreenOnFully) {return;}if (count 2) {powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);} else if (count 3) {powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);} else if (interactive !mBeganFromNonInteractive) {//关键流程step4 除了无效处理意外都会调用到PowerManagerService中的goToSleep方法switch (mShortPressOnPowerBehavior) {case SHORT_PRESS_POWER_NOTHING:break;case SHORT_PRESS_POWER_GO_TO_SLEEP:mPowerManager.goToSleep(eventTime,PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);break;case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:mPowerManager.goToSleep(eventTime,PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);break;case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:mPowerManager.goToSleep(eventTime,PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);launchHomeFromHotKey();break;}}}//... } 2 从PowerManagerService到Notifier的处理 从PhoneWindowManager的interceptKeyBeforeQueueing方法入口开始分析最终会到达PowerManagerService的gotoSleep方法从PowerManager到PowerManagerService的调用就不在分析了这个属于binder通信的范畴对应的代码实现如下 public final class PowerManagerService extends SystemServiceimplements Watchdog.Monitor {private static final String TAG PowerManagerService;private static final boolean DEBUG false;//...//关键流程step1private final class BinderService extends IPowerManager.Stub {Override // Binder callpublic void goToSleep(long eventTime, int reason, int flags) {if (eventTime SystemClock.uptimeMillis()) {throw new IllegalArgumentException(event time must not be in the future);}mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);final int uid Binder.getCallingUid();final long ident Binder.clearCallingIdentity();try {goToSleepInternal(eventTime, reason, flags, uid);} finally {Binder.restoreCallingIdentity(ident);}}//...}//...//关键流程step2private void goToSleepInternal(long eventTime, int reason, int flags, int uid) {synchronized (mLock) {if (goToSleepNoUpdateLocked(eventTime, reason, flags, uid)) {updatePowerStateLocked();}}}//...//关键流程step3private boolean goToSleepNoUpdateLocked(long eventTime, int reason, int flags, int uid) {if (eventTime mLastWakeTime|| mWakefulness WAKEFULNESS_ASLEEP|| mWakefulness WAKEFULNESS_DOZING|| !mBootCompleted || !mSystemReady) {return false;}try {//...mLastSleepTime eventTime;mSandmanSummoned true;setWakefulnessLocked(WAKEFULNESS_DOZING, reason);// Report the number of wake locks that will be cleared by going to sleep.int numWakeLocksCleared 0;final int numWakeLocks mWakeLocks.size();for (int i 0; i numWakeLocks; i) {final WakeLock wakeLock mWakeLocks.get(i);switch (wakeLock.mFlags PowerManager.WAKE_LOCK_LEVEL_MASK) {case PowerManager.FULL_WAKE_LOCK:case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:case PowerManager.SCREEN_DIM_WAKE_LOCK:numWakeLocksCleared 1;break;}}// Skip dozing if requested.if ((flags PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE) ! 0) {reallyGoToSleepNoUpdateLocked(eventTime, uid);}} return true;}//...//关键流程step4private boolean reallyGoToSleepNoUpdateLocked(long eventTime, int uid) {if (eventTime mLastWakeTime || mWakefulness WAKEFULNESS_ASLEEP|| !mBootCompleted || !mSystemReady) {return false;}try {mDirty | DIRTY_WAKEFULNESS;mWakefulness WAKEFULNESS_ASLEEP;setInteractiveStateLocked(false, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);}return true;}//关键流程step5private void setInteractiveStateLocked(boolean interactive, int reason) {if (mInteractive ! interactive) {finishInteractiveStateChangeLocked();mInteractive interactive;mInteractiveChanging true;mNotifier.onInteractiveStateChangeStarted(interactive, reason);}}//...//关键流程step6private void finishInteractiveStateChangeLocked() {if (mInteractiveChanging) {mNotifier.onInteractiveStateChangeFinished(mInteractive);mInteractiveChanging false;}}//... } 3 Notifier的处理 Notifier的处理包含2个层面一个是发送SCREEN_OFF的广播通知其他子系统亮屏的消息。一个是通过PhoneWindowManager的处理来逐层执行对应回调onScreenTurnedOff方法。 3.1 从Notifier最终发送SCREEN_OFF广播 针对发送广播的逻辑处理流程代码逻辑流程如下 //Notifier final class Notifier {private static final String TAG PowerManagerNotifier;private static final boolean DEBUG false;//...//关键流程step1public void onInteractiveStateChangeFinished(boolean interactive) {synchronized (mLock) {if (!interactive) {if (mActualPowerState ! POWER_STATE_ASLEEP) {mActualPowerState POWER_STATE_ASLEEP;mPendingGoToSleepBroadcast true;if (mUserActivityPending) {mUserActivityPending false;mHandler.removeMessages(MSG_USER_ACTIVITY);}mHandler.post(new Runnable() {Overridepublic void run() {int why WindowManagerPolicy.OFF_BECAUSE_OF_USER;switch (mLastGoToSleepReason) {case PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN:why WindowManagerPolicy.OFF_BECAUSE_OF_ADMIN;break;case PowerManager.GO_TO_SLEEP_REASON_TIMEOUT:why WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT;break;}EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 0, why, 0, 0);mPolicy.goingToSleep(why);mActivityManagerInternal.goingToSleep();}});updatePendingBroadcastLocked();}}}}//...//关键流程step2private void updatePendingBroadcastLocked() {if (!mBroadcastInProgress mActualInteractiveState ! INTERACTIVE_STATE_UNKNOWN (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast|| mActualInteractiveState ! mBroadcastedInteractiveState)) {mBroadcastInProgress true;mSuspendBlocker.acquire();Message msg mHandler.obtainMessage(MSG_BROADCAST);msg.setAsynchronous(true);mHandler.sendMessage(msg);}}//...//关键流程step3private final class NotifierHandler extends Handler {public NotifierHandler(Looper looper) {super(looper, null, true /*async*/);}Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_BROADCAST:sendNextBroadcast();break;//...}}}//消息处理当设备从睡眠状态唤醒时会发送 ACTION_SCREEN_ON 广播当设备准备进入睡眠状态时会发送 ACTION_SCREEN_OFF 广播。private void sendNextBroadcast() {final int powerState;synchronized (mLock) {//mBroadcastedInteractiveState相关处理//...mBroadcastStartTime SystemClock.uptimeMillis();powerState mBroadcastedInteractiveState;}EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_SEND, 1);// 根据电源状态发送相应的广播if (powerState INTERACTIVE_STATE_AWAKE) {sendWakeUpBroadcast(); //发送唤醒广播} else {sendGoToSleepBroadcast(); //发送睡眠广播}}//...//消息处理发送有序广播private void sendGoToSleepBroadcast() {if (ActivityManagerNative.isSystemReady()) {// 发送广播关键API参数解读如下// mScreenOnIntent 是一个 Intent包含了唤醒屏幕的信息// UserHandle.ALL 表示这个广播会发送给所有用户// mWakeUpBroadcastDone 是一个 BroadcastReceiver用于在广播完成后接收回调// mHandler 是一个 Handler用于处理广播完成后的回调// 0 是一个 flags表示广播的权限// 最后的 null, null 是额外的参数这里没有使用mContext.sendOrderedBroadcastAsUser(mScreenOffIntent, UserHandle.ALL, null,mGoToSleepBroadcastDone, mHandler, 0, null, null);} else {EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3, 1);sendNextBroadcast();}}//... } 这条逻辑的处理主要是发送睡眠广播为主。接下来分析从mPolicy.goingToSleep(why);出发的灭屏回调处理流程。 3.2 PhoneWindowManager的goingToSleep方法处理灭屏回调方法 这里主要是从到PhoneWindowManager的wakingUppolicy.goingToSleep方法再到各层的onScreenTurnedOff方法的处理逻辑流程从onInteractiveStateChangeFinished处开始代码实现如下 //Notifier final class Notifier {private static final String TAG PowerManagerNotifier;private static final boolean DEBUG false;//...public void onInteractiveStateChangeFinished(boolean interactive) {synchronized (mLock) {if (!interactive) {if (mActualPowerState ! POWER_STATE_ASLEEP) {mActualPowerState POWER_STATE_ASLEEP;mPendingGoToSleepBroadcast true;if (mUserActivityPending) {mUserActivityPending false;mHandler.removeMessages(MSG_USER_ACTIVITY);}mHandler.post(new Runnable() {Overridepublic void run() {int why WindowManagerPolicy.OFF_BECAUSE_OF_USER;switch (mLastGoToSleepReason) {case PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN:why WindowManagerPolicy.OFF_BECAUSE_OF_ADMIN;break;case PowerManager.GO_TO_SLEEP_REASON_TIMEOUT:why WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT;break;}EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 0, why, 0, 0);mPolicy.goingToSleep(why);mActivityManagerInternal.goingToSleep();}});updatePendingBroadcastLocked();}}}}//... } 这里会调用到PhoneWindowManager的goingToSleep方法。代码实现如下 //phonewindowmanagerOverridepublic void goingToSleep(int why) {EventLog.writeEvent(70000, 0);synchronized (mLock) {mAwake false;mKeyguardDrawComplete false;updateWakeGestureListenerLp();updateOrientationListenerLp();updateLockScreenTimeout();}if (mKeyguardDelegate ! null) {mKeyguardDelegate.onScreenTurnedOff(why);}} 这里会调用到KeyguardDelegate的onScreenTurnedOff方法。代码实现如下   //KeyguardDelegatepublic void onScreenTurnedOff(int why) {if (mKeyguardService ! null) {mKeyguardService.onScreenTurnedOff(why);}mKeyguardState.offReason why;mKeyguardState.screenIsOn false;} 这里会调用到KeyguardServiceWrapper的onScreenTurnedOff方法。代码实现如下 //wrapperOverride // Binder interfacepublic void onScreenTurnedOff(int reason) {try {mService.onScreenTurnedOff(reason);} catch (RemoteException e) {Slog.w(TAG , Remote Exception, e);}} 这里会调用到KeyguardService的onScreenTurnedOff方法。代码实现如下 //KeyguardService//binderOverride // Binder interfacepublic void onScreenTurnedOff(int reason) {checkPermission();mKeyguardViewMediator.onScreenTurnedOff(reason);} 这里会调用到KeyguardViewMediator的onScreenTurnedOff方法。这里才是真正的逻辑实现代码实现如下 //KeyguardViewMediatorpublic void onScreenTurnedOff(int why) {synchronized (this) {// 将屏幕状态设置为关闭mScreenOn false;// 重置关键的锁屏完成等待状态resetKeyguardDonePendingLocked();// 标记未运行隐藏动画mHideAnimationRun false;// 判断是否需要立即锁屏// 如果设置为按下电源键立即锁屏或者设备没有设置安全措施则立即锁屏final boolean lockImmediately mLockPatternUtils.getPowerButtonInstantlyLocks() || !mLockPatternUtils.isSecure();// 通知屏幕已关闭notifyScreenOffLocked();// 如果存在退出安全模式的回调执行回调并设置为nullif (mExitSecureCallback ! null) {// 执行回调以通知锁屏退出的结果try {mExitSecureCallback.onKeyguardExitResult(false);} catch (RemoteException e) {// 如果远程调用失败记录错误Slog.w(TAG, Failed to call onKeyguardExitResult(false), e);}mExitSecureCallback null;// 如果锁屏没有被外部启用隐藏锁屏if (!mExternallyEnabled) {hideLocked();}} else if (mShowing) {// 如果锁屏当前正在显示重置锁屏状态resetStateLocked();} else if (why WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT ||(why WindowManagerPolicy.OFF_BECAUSE_OF_USER !lockImmediately)){// 如果屏幕是因为超时关闭或者用户主动关闭但不需要立即锁屏// 则计划延迟显示锁屏doKeyguardLaterLocked();} else {// 否则立即显示锁屏doKeyguardLocked(null);}}// 通知更新监控器屏幕已关闭并传递关闭的原因KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurndOff(why);} 这里总结下onScreenTurnedOff 关键逻辑解读如下 当屏幕关闭时这个方法会被调用。如果设备设置为按下电源键立即锁定或者设备没有设置安全措施如PIN、密码、图案则变量 lockImmediately 会被设置为 true。根据 why 参数的值表示屏幕关闭的原因决定是否立即调用 doKeyguardLocked 或者延迟调用 doKeyguardLaterLocked也会调用doKeyguardLocked 。 接下来关于doKeyguardLocked的处理可以参考如下文章 Android SystemUI组件07锁屏KeyguardViewMediator分析 参考其第二部分2.2 即可。
http://www.hkea.cn/news/14522233/

相关文章:

  • 网站模版亮点网站建设引流刘贺稳1
  • 泰安企业建站公司排行巴马网站建设
  • 自助建站帮助网网站树状栏目有点
  • 商城手机网站建设如何搭建高访问量的网站
  • 网站app推广怎么做中国建设厅网站
  • 淘客网站如何建设自己数据库ui培训机构排行榜
  • 河间网站建设网站开发做什么简单
  • 云虚拟主机建设网站一定要域名贵阳网站开发推荐
  • 网站 建设 领导小组好的网站 具备
  • 重庆住建厅网站官网沈阳信息港
  • 公司网站做一年多少钱wordpress 数据库空间
  • 品牌购买平台优化技术服务
  • 贵阳拍卖网站开发公司dedecms 调用网站内部搜索
  • vue做网站免费网页源码
  • 青海西宁网站开发公司苏州工业园区教育局官网
  • 流浪猫狗救助网站开发设计公司名称变更
  • 网站域名改了帝国cms教育app定制开发
  • 做服装网站设计书莱芜百姓网
  • 重庆建站服务商网站开发教学大纲
  • 深圳建设网站软件界面设计与色彩搭配
  • 太原有网站工程公司吗wordpress主题汉化包放哪里
  • 检测asp网站死循环wordpress lovevideo
  • 成品网站源码在线常德网站建设专业品牌
  • 广州电商网站建设做优秀网站
  • 怎么做狼视听网站更改wordpress主题语言包
  • 免费的域名注册网站金华住房和城乡建设厅网站
  • 网站不备案能访问吗骨干校 建设网站
  • 网站建设实习心得网站没有备案做竞价吗
  • 龙泉驿区建设局网站wordpress多合一seo包
  • wordpress加载谷歌seo千享科技