(轉(zhuǎn))onWindowFocusChanged觸發(fā)簡介

轉(zhuǎn)自:http://blog.csdn.net/yueqinglkong/article/details/44981449

看看源碼中對該方法的說明:
Called when the current Android.view.Window

of the activity gains or loses focus. This is the best indicator of whether this activity is visible to the user. The default implementation clears the key tracking state, so should always be called.
Note that this provides information about global focus state, which is managed independently of activity lifecycles. As such, while focus changes will generally have some relation to lifecycle changes (an activity that is stopped will not generally get window focus), you should not rely on any particular order between the callbacks here and those in the other lifecycle methods such asonResume()

.
As a general rule, however, a resumed activity will have window focus... unless it has displayed other dialogs or popups that take input focus, in which case the activity itself will not have focus when the other windows have it. Likewise, the system may display system-level windows (such as the status bar notification panel or a system alert) which will temporarily take window input focus without pausing the foreground activity.
大概意思:
當前窗體得到或失去焦點的時候的時候調(diào)用雨效。這是這個活動是否是用戶可見的最好的指標蛤高。默認的實現(xiàn)清除重點跟蹤狀態(tài)撵彻,所以應該總是被調(diào)用艺演。請注意,這提供了有關(guān)整體焦點狀態(tài)信息贱傀,這是獨立管理活動的生命周期惨撇。因此,焦點的變化通常會有一些關(guān)系生命周期變化(一種活動停止一般不會得到窗口焦點)府寒,你應該不依賴于任何特定的順序之間的回調(diào)在這里和那些在其他生命周期方法如onresume()魁衙。作為一般規(guī)則,然而椰棘,一個恢復活動將得到窗口焦點…除非有其他對話框彈出窗口顯示或接受輸入焦點纺棺,在這種情況下榄笙,活動本身不會有焦點時邪狞,其他窗口擁有它。同樣茅撞,系統(tǒng)會顯示系統(tǒng)頂層窗口(如狀態(tài)欄通知面板或警報系統(tǒng))將暫時不停頓的前臺活動帶窗口的輸入焦點帆卓。
在Activity的生命周期中巨朦,onCreate()--onStart()--onResume()都不是窗體Visible的時間點,真正的窗體完成初始化可見獲取焦點可交互是在onWindowFocusChanged()方法被執(zhí)行時剑令,而這之前糊啡,對用戶的操作需要做一點限制。比如我們在做OTT項目時候,我們就是在這onWindowFocusChanged來獲取主按鍵的具體位置和寬高的,而在其他標準生命周期的接口中調(diào)用都是獲取不到的吁津,比如在onResume棚蓄,onStart中都獲取不到信息。這個onWindowFocusChanged指的是這個Activity得到或者失去焦點的時候 就會call碍脏。梭依。也就是說 如果你想要做一個Activity一加載完畢,就觸發(fā)什么的話 完全可以用這個5湮病R鬯!使用一個view的getWidth() getHeight() 方法來獲取該view的寬和高钾埂,返回的值卻為0河闰。如果這個view的長寬很確定不為0的話,那很可能是你過早的調(diào)用這些方法褥紫,也就是說在這個view被加入到rootview之前你就調(diào)用了這些方法姜性,返回的值自然為0.

下面測試代碼:

public class MainActivity extends Activity {  

    private String Tag = "MainActivity";  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        init();  
        Log.d(Tag, "onCreate");  
    }  
  
    public void init() {  
        Button nextBtn = (Button) findViewById(R.id.btn_next);  
        nextBtn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Intent intent = new Intent();  
                intent.setClass(MainActivity.this, NextActivity.class);  
                startActivity(intent);  
            }  
        });  
        Button nextBackBtn = (Button) findViewById(R.id.btn_next_back);  
        nextBackBtn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Intent intent = new Intent();  
                intent.setClass(MainActivity.this, NextActivity.class);  
                startActivityForResult(intent, 10);  
            }  
        });  
  
        Button dialogBtn = (Button) findViewById(R.id.btn_dialog);  
        dialogBtn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                new AlertDialog.Builder(MainActivity.this)  
                        .setTitle("確認")  
                        .setMessage("確定嗎?")  
                        .setPositiveButton("是", null)  
                        .setNegativeButton("否", null)  
                        .show();  
            }  
        });  
    }  
  
    @Override  
    protected void onStart() {  
        super.onStart();  
        Log.d(Tag, "onStart");  
    }  
  
    @Override  
    protected void onResume() {  
        super.onResume();  
        Log.d(Tag, "onResume");  
    }  
  
    @Override  
    public void onAttachedToWindow() {  
        super.onAttachedToWindow();  
        Log.d(Tag, "onAttachedToWindow");  
    }  
  
    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        if (hasFocus) {  
            Log.d(Tag, "onWindowFocusChanged:" + "true");  
        } else {  
            Log.d(Tag, "onWindowFocusChanged:" + "false");  
        }  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        Log.d(Tag, "onPause");  
    }  
  
    @Override  
    protected void onStop() {  
        super.onStop();  
        Log.d(Tag, "onStop");  
    }  
  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        Log.d(Tag, "onDestroy");  
    }  
  
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        super.onActivityResult(requestCode, resultCode, data);  
        Log.d(Tag, "onActivityResult");  
    }  

}  

跳轉(zhuǎn)的頁面:

public class NextActivity extends Activity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_next);  
        init();  
    }  
  
    public void init() {  
        Button backBtn = (Button) findViewById(R.id.btn_setback);  
        backBtn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                setResult(15, null);  
                finish();  
            }  
        });  
    }  
    
}  

運行效果髓考,在圖中標注的很詳細了:

20150410164920239.png
20150410164938244.png

注意:
1.token null is not valid; is your activity running:
在窗體不能交互的時候污抬,彈出對話框之類有可能會報錯,在初始化過程中绳军,講與其他窗口有關(guān)的操作放到獲取到焦點后操作晌坤。

  /**  
   * bug :unable to add window -- token null is not  
   * 添加窗體在視圖初始化完成過后  
   *  
   * @param hasFocus  
   */  
  @Override  
  public void onWindowFocusChanged(boolean hasFocus) {  
      super.onWindowFocusChanged(hasFocus);  
      if (hasFocus) {  
         //add Window.....  
      }  
  }  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坑鱼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翔试,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件基矮,死亡現(xiàn)場離奇詭異聚磺,居然都是意外死亡,警方通過查閱死者的電腦和手機聂沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門秆麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人及汉,你說我怎么就攤上這事沮趣。” “怎么了坷随?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵房铭,是天一觀的道長驻龟。 經(jīng)常有香客問我,道長缸匪,這世上最難降的妖魔是什么翁狐? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凌蔬,結(jié)果婚禮上露懒,老公的妹妹穿的比我還像新娘。我一直安慰自己砂心,他們只是感情好隐锭,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著计贰,像睡著了一般钦睡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躁倒,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天荞怒,我揣著相機與錄音,去河邊找鬼秧秉。 笑死褐桌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的象迎。 我是一名探鬼主播荧嵌,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砾淌!你這毒婦竟也來了啦撮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤汪厨,失蹤者是張志新(化名)和其女友劉穎赃春,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫乱,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡织中,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衷戈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭吼。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖殖妇,靈堂內(nèi)的尸體忽然破棺而出刁笙,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布采盒,位于F島的核電站,受9級特大地震影響蔚润,放射性物質(zhì)發(fā)生泄漏磅氨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一嫡纠、第九天 我趴在偏房一處隱蔽的房頂上張望烦租。 院中可真熱鬧,春花似錦除盏、人聲如沸叉橱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窃祝。三九已至,卻和暖如春踱侣,著一層夾襖步出監(jiān)牢的瞬間粪小,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工抡句, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留探膊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓待榔,卻偏偏與公主長得像逞壁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锐锣,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容