久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

喚醒休眠的Android設(shè)備并做適當(dāng)UI提醒的總結(jié)與思考

 風(fēng)雪夜歸人_95 2015-02-09
    最近在做的一個(gè)Android APP項(xiàng)目,需要實(shí)現(xiàn)這樣的效果:當(dāng)Android設(shè)備處于任何界面時(shí)(該APP正在后臺(tái)運(yùn)行),,當(dāng)有消息來到時(shí),,需要立刻彈出一個(gè)對(duì)話框提示;而如果設(shè)備是休眠狀態(tài)時(shí),,需要立刻喚醒設(shè)備,,提示對(duì)話框。這有點(diǎn)類似于Android手機(jī)上的qq消息提示,。主要的難點(diǎn)是:如何喚醒設(shè)備,,如何讓對(duì)話框顯示出來,。
     對(duì)于喚醒設(shè)備,很明顯,,是需要權(quán)限的,。在Androidmanifest.xml添加了相應(yīng)的權(quán)限,貌似沒有作用,。后臺(tái)在貼吧上找到了一個(gè)說法,,在oncreate函數(shù)中添加了下面的代碼:
 final android.view.Window win = getWindow();  
         win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED  
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD  
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
       通過命名就可以知道,這部分獲取到窗口的一個(gè)實(shí)例并添加了相應(yīng)的標(biāo)志位,,就可以實(shí)現(xiàn)休眠喚醒,。對(duì)于這個(gè)部分,沒有太多可以說的,,也不再深究,。
       而對(duì)于第二個(gè)問題,確實(shí)費(fèi)了一番功夫,。首先,,對(duì)話框可以用一個(gè)activity來實(shí)現(xiàn),改變其大小為合適大小,。但是此時(shí),,你會(huì)發(fā)現(xiàn)背景色還是有的,當(dāng)然希望將背景色改為透明,。但是這還不是大問題,,大問題是當(dāng)有多條信息來到時(shí),會(huì)有多個(gè)這樣的對(duì)話框來到,,用戶需要多次點(diǎn)擊屏幕才能清理這些對(duì)話框,。這樣的效果肯定是不能接收的。而且,,如果在接收多條信息之前設(shè)備在別的應(yīng)用或在桌面時(shí),,看不到這個(gè)對(duì)話框,只有進(jìn)入該應(yīng)用才可以看到,。網(wǎng)上有人提到了affinity屬性,,也有人提到使用“singleTask”啟動(dòng)這個(gè)activity,。試了一下,,可以,但是當(dāng)有多條信息到來時(shí),,仍然有問題,,它始終顯示的是第一條信息的內(nèi)容,這也很容易讓用戶認(rèn)為是個(gè)錯(cuò)誤,。所以,,必須弄清楚其本質(zhì)原理才能解決這個(gè)問題,。通過查閱資料,終于明白了其中的原理,。各位看官,,看筆者娓娓道來。

背景知識(shí)
     1 Android task
     一般情況下,,同一個(gè)應(yīng)用中啟動(dòng)的activity都在同一個(gè)task中,。Android task是一個(gè)具有棧結(jié)構(gòu)的容器,啟動(dòng)一個(gè)應(yīng)用,,系統(tǒng)就會(huì)為之創(chuàng)建一個(gè)task,,來放置根activity。默認(rèn)情況下,,一個(gè)activity啟動(dòng)另一個(gè)activity時(shí),,二者會(huì)放在同一個(gè)task中,后者被壓入前者所在的task棧,。系統(tǒng)task和task之間是相互獨(dú)立的,,正在運(yùn)行一個(gè)應(yīng)用時(shí),按下home鍵回到主屏,,實(shí)際上是將該應(yīng)用對(duì)應(yīng)的task轉(zhuǎn)移到后臺(tái),,系統(tǒng)task轉(zhuǎn)移到前臺(tái)。(其實(shí)這里的系統(tǒng)task特指的就是lancher,,它有系統(tǒng)啟動(dòng),,可以理解為特殊的一個(gè)應(yīng)用)
      每一個(gè)activity都有一個(gè)affinity(親和力)的屬性,該屬性像身份證一樣,,通過它可以知道該activity所在的task,,擁有相同affinity的多個(gè)activity同屬于同一個(gè)task(但可能屬于不同的應(yīng)用,這點(diǎn)后面會(huì)講到)
     2 Intent幾種常見的flags
     1)FLAG_ACTIVITY_NEW_TASK 當(dāng)Intent對(duì)象包含這個(gè)標(biāo)記是,,系統(tǒng)會(huì)尋找或創(chuàng)建一個(gè)新的task來放置activity,,根據(jù)要啟動(dòng)的activity的affinity屬性進(jìn)行匹配,若找到,,則壓入那個(gè)task中,,若沒有則創(chuàng)建一個(gè)新task,那么該task的Affinity設(shè)置為要啟動(dòng)的Activity的Affinity,,這個(gè)新task的根就是這個(gè)開啟的activity,。
   在一個(gè)應(yīng)用A中的某個(gè)activity以標(biāo)準(zhǔn)模式使用Intent啟動(dòng)另一個(gè)應(yīng)用B的某個(gè)activity,這個(gè)activity會(huì)被直接壓入到應(yīng)用A的task中,;但如果這個(gè)Intent被設(shè)置了上面的參數(shù),,則在啟動(dòng)B中的activity時(shí)會(huì)創(chuàng)建一個(gè)新的task,并將B中的這個(gè)activity放在這個(gè)新的task中,。
     2)FLAG_ACTIVITY_CLEAR_TOP:當(dāng)Intent對(duì)象包含這個(gè)標(biāo)記時(shí),,如果棧中發(fā)現(xiàn)存在activity實(shí)例,,則清空這個(gè)實(shí)例之上的activity,使其處于棧頂,。如果這個(gè)activity的啟動(dòng)模式是“standard”,,且沒有在Intent另外設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)記,則該activity將先銷毀自己,,再重建,。如果設(shè)置了FLAG_ACTIVITY_SINGLE_TOP標(biāo)記,則會(huì)使用已存在的實(shí)例,,Intent被傳遞到這個(gè)實(shí)例的onNewIntent()中,。如果該activity的啟動(dòng)模式是其他模式,則不管設(shè)置FLAG_ACTIVITY_SINGLE_TOP與否,,都會(huì)使用已存在的實(shí)例,。
     3)FLAG_ACTIVITY_SINGLE_TOP當(dāng)task存在目標(biāo)activity實(shí)例且位于棧的頂端時(shí),直接使用這個(gè)實(shí)例,。
     4)FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 如果一個(gè)Intent包含這個(gè)屬性,,它轉(zhuǎn)向的那個(gè)activity以及那個(gè)activity之上的所有activity都會(huì)在task重置時(shí)被清除出task。特別地,,當(dāng)我們將一個(gè)后臺(tái)的task重新回到前臺(tái)時(shí),,系統(tǒng)會(huì)在特定情況下為這個(gè)動(dòng)作附帶一個(gè)FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記,即必要時(shí)重置task,,一旦觸發(fā)重置,,則會(huì)執(zhí)行清理操作。
     5)FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 這個(gè)標(biāo)記在以下情況下會(huì)生效:1.啟動(dòng)Activity時(shí)創(chuàng)建新的task來放置Activity實(shí)例,;2.已存在的task被放置于前臺(tái),。系統(tǒng)會(huì)根據(jù)affinity對(duì)指定的task進(jìn)行重置操作,task會(huì)壓入某些Activity實(shí)例或移除某些Activity實(shí)例,。

Android:allowTaskReparenting
該屬性用來標(biāo)記一個(gè)activity實(shí)例在當(dāng)前應(yīng)用退居后臺(tái)后,,是否能從啟動(dòng)它的那個(gè)task移動(dòng)到有共同Affinity的task,TRUE表示可以移動(dòng),,F(xiàn)ALSE表示必須呆在當(dāng)前應(yīng)用的task中,。默認(rèn)值為FALSE。
例如:
一個(gè)應(yīng)用A的activity a啟動(dòng)了另一個(gè)應(yīng)用B的activity b,。此時(shí)a 和 b均在應(yīng)用A所在的task中,。此時(shí)應(yīng)用A回到后臺(tái),若該屬性為TRUE,,則再次啟動(dòng)A時(shí),,會(huì)顯示activity a,如果此時(shí)再啟動(dòng)B,則直接看到activity b,。因?yàn)閎從A的task(啟動(dòng)它的task移動(dòng)到有共同Affinity的task),。不過要注意的是,如果當(dāng)A回到后臺(tái),,直接啟動(dòng)B,,則不會(huì)出現(xiàn)上述的移動(dòng),移動(dòng)發(fā)生在A再次啟動(dòng)的時(shí)候,。
綜上所述:
       1:要?jiǎng)?chuàng)建新任務(wù),,至少要滿足兩個(gè)條件:不同app和以SingleTask方式啟動(dòng),否則在同一個(gè)app中以SingleTask方式打開Activity是不會(huì)新創(chuàng)建任務(wù)的,。(這里有一個(gè)特殊情況,,設(shè)置Activity的android:taskAffinity屬性可以讓Activity看起來是屬于另一個(gè)包,屬于另一個(gè)Activity)
       2.在最近任務(wù)中進(jìn)行多個(gè)任務(wù)之間的相互切換時(shí)不會(huì)打亂每個(gè)任務(wù)中Activity的排列,。但是在點(diǎn)擊app圖標(biāo)進(jìn)行多個(gè)任務(wù)切換時(shí),,系統(tǒng)會(huì)先判斷該任務(wù)根Activity的啟動(dòng)模式是否為SingleTask,不是的話,,不做任何操作,,如果是的話,執(zhí)行根Activity的onNewIntent方法,,把覆蓋在根Activity之上的Activity destory掉,。
       3.當(dāng)沒有創(chuàng)建新任務(wù)時(shí),新打開的Activity會(huì)一直進(jìn)行當(dāng)前任務(wù)中進(jìn)棧,,無論這些個(gè)Activity是屬于哪一個(gè)App,。

現(xiàn)象解釋
       
有了上面的解釋,則上面提到的實(shí)驗(yàn)現(xiàn)象是非常好理解的了,。首先,,剛開始由于activity的啟動(dòng)模式為“standard”,所以,,每當(dāng)有信息到來時(shí),,后臺(tái)的程序會(huì)使用Intent啟動(dòng)一個(gè)activity,這個(gè)activity這就是剛開始收到多條信息會(huì)彈出多個(gè)對(duì)話框的原因,。又由于該該activity屬于一個(gè)在后臺(tái)的task,,所以啟動(dòng)的activity會(huì)被壓入到該task的棧中,只有當(dāng)該task重新回到前臺(tái)才會(huì)看到這些對(duì)話框,。將activity的啟動(dòng)模式設(shè)置為了“singleTask”,啟動(dòng)的activity被壓入一個(gè)新的task的棧中,,這就像點(diǎn)擊某個(gè)圖標(biāo)開啟一個(gè)應(yīng)用一樣,這個(gè)task會(huì)到前臺(tái)來,,也就是為什么我們此時(shí)可以看到對(duì)話框會(huì)彈到前臺(tái)來,。至于最后提到的問題,對(duì)話框的內(nèi)容是第一次信息的內(nèi)容,,后面的信息來到時(shí),,系統(tǒng)發(fā)現(xiàn)該task下已經(jīng)有了一個(gè)這樣的activity了,,就不再重新創(chuàng)建,而是直接復(fù)用,,Intent傳過來的值直接傳給newOnIntent函數(shù),。所以只需要在這個(gè)對(duì)話框的activity中重寫
newOnIntent函數(shù),把接收到的消息顯示到對(duì)話框中即可,。

至此,,所有的現(xiàn)象都得到了解釋,知其然,,知其所以然,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多