´Ó×ÖÃæÉÏÀ´½²£¬onWindowsFocusChanged()·½·¨ÊÇÖ¸µ±´°¿Ú½¹µã±ä»¯µÄʱºò£»´ÓÒâÒåÀ´Ëµ£¬onWindowsFocusChanged()¾ÍÊÇÖ¸µ±Ç°µÄActivityµÄWindows(´°¿Ú)»ñÈ¡»òÕßʧȥ½¹µãʱÕâ¸ö·½·¨¾Í»á±»µ÷Ó㬲¢ÇÒµ±»Øµ÷Õâ¸ö·½·¨Ê±£¬ActivityÊÇÍêÈ«¿É¼ûµÄ¡£
ÔÚActivityÉúÃüÖÜÆÚÖУ¬onStart(), onResume(), onCreate()¶¼²»ÊDz¼¾ÖvisibleµÄʱ¼äµã£¬ÕæÕýµÄvisibleʱ¼äµãÊÇonWindowFocusChanged()º¯Êý±»Ö´ÐÐʱ¡£´ÓonWindowFocusChanged()±»Ö´ÐÐÆð£¬Óû§¿ÉÒÔÓëÓ¦ÓýøÐн»»¥ÁË£¬»»¾ä»°Ëµ£¬Èç¹ûÄãÏëÒªÔÚActivity¼ÓÔØºó×öЩ²Ù×÷£¬¿ÉÒÔÔÚÕâ¸ö·½·¨Àïµ÷ÓöøÕâ֮ǰ£¬¶ÔÓû§µÄ²Ù×÷ÐèÒª×öÒ»µãÏÞÖÆ¡£
¸ù¾Ý½éÉÜ¿ÉÒÔÁ˽⣬onWindowFocusChanged()ʹÓÃÓÚÒÔϵÈÇé¾°£º
Ê״νøÈëÒ»¸öActivityºó»áÔÚonResume()·½·¨ºóÃæµ÷Óã»
´ÓActivity Ìøµ½ÁíÒ»¸öActivity£¬ÐµĴ°¿Ú»á»ñÈ¡½¹µã, ¾ÍµÄActivityµÄ´°¿Ú»áʧȥ½¹µã£»
´ò¿ªÈí¼üÅ̽øÐÐÊäÈëʱ£¬´°¿Úʧȥ½¹µã£»
Èí¼üÅÌÊäÈëÍê±ÏÏûʧʱ£¬´°¿ÚÖØÐ»ñÈ¡½¹µã£»
Ó¦ÓýøÈëºǫ́£¬´°¿Úʧȥ½¹µã£»
Ó¦ÓôӺǫ́·µ»Øµ±Ç°, ´°¿ÚÖØÐ»ñÈ¡½¹µã£»
…
Òò´ËÆä¿ÉÒÔÓÐÈçÏÂ×÷Óãº
¼à¿ØÒ»¸öActivityÊÇ·ñÔØÍê±Ï£»
ÔÚActivity¼ÓÔØºó½øÐÐһЩ²Ù×÷£¬Èç»ñÈ¡ÊÖ»úÆÁÄ»µÄ¸ß¶ÈºÍ¿í¶È£»
µ±Activity¹ÒÆð»ò»Ö¸´Ê±£¬¿ÉÒÔÔÚ·½·¨ÄÚ½øÐÐһЩÊý¾ÝµÄ±£´æ»ò»Ö¸´µÄ²Ù×÷£»
…
½éÉÜÍêonWindowFocusChanged()»ù±¾µÄʹÓÃÇé¾°ÒÔ¼°×÷Óúó£¬ß£¸ödemoÀ´¿´ÏÂonWindowFocusChanged()¾ßÌåµÄµ÷ÓÃÇé¿ö¡£
Ê×ÏÈÔÚActivityÖÐÖØÐ´µÄonWindowFocusChanged()·½·¨ÈçÏ£º
/** * Ìí¼Ó´°ÌåÔÚÊÓͼ³õʼ»¯Íê³É¹ýºó * * @param hasFocus */ @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { //add Window..... } }
ÆäÖвÎÊýhasFocus±íʾ´°¿ÚÊÇ·ñ»ñÈ¡»òʧȥ½¹µã£¬true±íʾ»ñÈ¡½¹µã£¬false±íʾʧȥ½¹µã¡£
È»ºóÎÒÃÇ¿´ÏÂ×ÜÌåµÄ´úÂ룺
public class WindosFoucesDemo extends AppCompatActivity { private static final String TAG = "LifeCycleDemo"; //Activity´´½¨Ê±±»µ÷Óà @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate is called."); setContentView(R.layout.activity_main); } //Activity´´½¨»òÕß´ÓºóÌ¨ÖØÐ»ص½Ç°Ì¨Ê±±»µ÷Óà @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart is called."); } //Activity´´½¨»òÕß´Ó±»¸²¸Ç¡¢ºóÌ¨ÖØÐ»ص½Ç°Ì¨Ê±±»µ÷Óà @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume is called."); } //Activity´°¿Ú»ñµÃ»òʧȥ½¹µãʱ±»µ÷ÓÃ,ÔÚonResumeÖ®ºó»òonPauseÖ®ºó @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(hasFocus){ Log.i(TAG, "onWindowFocusChanged is called and" + "hasFocus is true"); }else { Log.i(TAG, "onWindowFocusChanged is called and" + "hasFocus is false"); } } //Activity±»¸²¸Çµ½ÏÂÃæ»òÕßËøÆÁʱ±»µ÷Óà @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause is called."); //ÓпÉÄÜÔÚÖ´ÐÐÍêonPause»òonStopºó,ϵͳ×ÊÔ´½ôÕŽ«ActivityɱËÀ,ËùÒÔÓбØÒªÔڴ˱£´æ³Ö¾ÃÊý¾Ý } //Í˳öµ±Ç°Activity»òÕßÌø×ªµ½ÐÂActivityʱ±»µ÷Óà @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop is called."); } //Í˳öµ±Ç°Activityʱ±»µ÷ÓÃ,µ÷ÓÃÖ®ºóActivity¾Í½áÊøÁË @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestory is called."); } //Activity´ÓºóÌ¨ÖØÐ»ص½Ç°Ì¨Ê±±»µ÷Óà @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart called."); } }
ÔËÐиÃDemo£¬²é¿´LogÈÕÖ¾£¬¿ÉÒԵõ½ÒÔÏÂÈÕÖ¾½á¹û¡£
1. Æô¶¯Activityʱ:
2. °´ÏÂÈÎÎñÀ¸¼ü£¬Activity±»ÕÚµ²Ê±£º<†·Ÿ"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="image" src="/uploadfile/Collfiles/20170710/201707100947351297.png" title="\" />
×¢Ò⣺°´ËøÆÁ¼üºÍ°´ÈÎÎñÀ¸»òÕßHome¼üµÄÉúÃüÖÜÆÚÊDz»Í¬µÄ£¬°´HomeÖ´ÐÐonPause –> onStop –> onRestart –> onStart —> onResume °´ËøÆÁ¼üºÍ¶Ô»°¿ò¸²¸Ç½çÃæµÄÉúÃüÖÜÆÚÊÇÒ»ÑùµÄ£¬¶¼Ö»»á½øÐÐonPause ££> onResume .²»»áÖ´ÐÐonStop,onRestart,onStart¡£
3. Activity»Ö¸´µ½Ç°Ì¨Ê±£º
4. ActivityÍ˳öʱ£º
´ÓÉÏÃæµÄÀý×ÓÒÔ¼°½á¹û¿ÉÒÔÇå³þµÄonWindowFocusChanged()ÔÚÕû¸öActivityÉúÃüÖÜÆÚÄڵĵ÷ÓÃÇé¿ö£¬¿ÉÒÔ¸ù¾ÝÕâЩ½á¹û£¬ÔÚ¿ª·¢ÖÐÀ´³ä·ÖÀûÓÃonWindowFocusChanged()·½·¨µÄ×÷Óá£
ͨ¹ýActivityÔ´ÂëÈ¥²é¿´,·¢ÏÖonWindowFocusChanged()Õâ¸ö·½·¨³öÏÖÔÚWindowCallbackWrapper.javaºÍView.javaÕâÁ½¸öÀàÖУ¬¶øWindowCallbackWrapper.javaÖÐÆäʵҲÊǵ÷ÓÃView.javaÖеÄonWindowFocusChanged()£¬Æä´úÂëÈçÏ£º
/** * Called when the window containing this view gains or loses focus. Note * that this is separate from view focus: to receive key events, both * your view and its window must have focus. If a window is displayed * on top of yours that takes input focus, then your own window will lose * focus but the view focus will remain unchanged. * * @param hasWindowFocus True if the window containing this view now has * focus, false otherwise. * µ±Ç°µÄwindow(´°¿Ú)»ñÈ¡»òÕßʧȥ½¹µãµÄʱºò»á»Øµ÷Õâ¸ö·½·¨.Çë×¢Òâ,Õâ¸ö½¹µãºÍ * view½¹µãÊÇ·ÖÀëµÄ,ΪÁË»ñÈ¡°´¼üʼþ,viewºÍviewËùÔڵĴ°¿Ú¶¼±ØÐë»ñµÃ½¹µã.Èç¹û * Ò»¸ö´°¿Ú´¦ÓÚÄãµÄÊäÈëʼþµÄ×îÉϲã,ÄÇô¸Ã´°¿Ú½«Ê§È¥½¹µã¶øviewµÄ½¹µã»á±£³Ö²» * ±ä. */ public void onWindowFocusChanged(boolean hasWindowFocus) { //»ñÈ¡Èí¼üÅÌa system window such as the keyguard may InputMethodManager imm = InputMethodManager.peekInstance(); if (!hasWindowFocus) { if (isPressed()) { //¼üÅÌÓа´ÏÂʼþ,ÔòÇ¿ÖÆ½«¸Ãview°üº¬µÄËùÓÐ×ӿؼþÈ«²¿setPressed()ÉèÖÃΪfalse setPressed(false); } if (imm != null && (mPrivateFlags & FOCUSED) != 0) { //ÕâÊÇÒ»¸öÒþ²ØµÄ·½·¨(´ø@hide±êÇ©),µ±viewʧȥ½¹µãʱ»áµ÷Óø÷½·¨ imm.focusOut(this); } //ÒÆonWindowFocusChanged(boolean hasFocus) ±»»Øµ÷µÄ´¥·¢Ê±»úÊÇ´°¿Ú»ñÈ¡»òʧȥ½¹µãµÄʱºò.³ý³¤°´Ê¼þ»Øµ÷µÄ½Ó¿Ú·½·¨ removeLongPressCallback(); //ÒÆ³ýÇᴥ̽²âÆ÷,Ô´ÂëÖнР"Remove the tap detection timer." removeTapCallback(); //µ±½¹µã(fucos)´Ó°´Ï±ä³ÉÈ¡ÏûµÄʱºò»áµ÷ÓÃ,ÊôÓÚÒþ²Ø·½·¨ onFocusLost(); } else if (imm != null && (mPrivateFlags & FOCUSED) != 0) { //µ±view»ñµÃ½¹µãʱµ÷Óø÷½·¨,ÊôÓÚÒþ²Ø·½·¨ imm.focusIn(this); } //Ç¿ÖÆviewË¢ÐÂdrawable state,²¢ÇÒ»á»Øµ÷drawableStateChanged()·½·¨ refreshDrawableState(); }
´ÓÔ´Âë¿ÉÒÔÑéÖ¤³ö£¬onWindowFocusChanged()·½·¨±»»Øµ÷µÄ´¥·¢Ê±»úÊÇ´°¿Ú»ñÈ¡»òʧȥ½¹µãµÄʱºò¡£²¢ÇÒÔÚonResume()·½·¨ÖеĹٷ½½âÊÍ Use {@link #onWindowFocusChanged} to know for certain that your activity is visible to the user (for example, to resume a game). ¿ÉÒÔÖªµÀonWindowFocusChanged()µÚÒ»´Îµ÷ÓÃÊÇÔÚonResume()·½·¨ºóÃæ¡£