Android程序開發(fā)仿新版QQ鎖屏下彈窗功能
新版的qq,可以在鎖屏下彈窗顯示qq消息,正好目前在做的項(xiàng)目也需要這一功能。經(jīng)過各種試驗(yàn)和資料查找,終于實(shí)現(xiàn),過程不難,但是卻有一些地方需要注意。
下面是實(shí)現(xiàn)過程。
1.使用Activity,而不是View
QQ的彈窗一開始我以為是懸浮View,用WindowManager去添加,但是無(wú)論如何就是不顯示,后來(lái)在朋友提示下?lián)Q成Activity來(lái)實(shí)現(xiàn),在鎖屏狀態(tài)下就能彈窗了。
2.Activity的設(shè)置
Activity需要進(jìn)行以下設(shè)置,才可以在鎖屏狀態(tài)下彈窗。
首先是onCreate方法,需要添加4個(gè)標(biāo)志,如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final 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è)標(biāo)志位顧名思義,分別是鎖屏狀態(tài)下顯示,解鎖,保持屏幕長(zhǎng)亮,打開屏幕。這樣當(dāng)Activity啟動(dòng)的時(shí)候,它會(huì)解鎖并亮屏顯示。
然后在AndroidManifest.xml文件當(dāng)中,對(duì)該activity的聲明需要加上以下屬性:
<activity android:name=".alarm.AlarmHandlerActivity" android:launchMode="singleInstance" android:excludeFromRecents="true" android:taskAffinity="" android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>
而對(duì)于布局文件,要顯示的view居中,背景透明。由于上面已經(jīng)設(shè)置了背景為壁紙的背景,所以顯示的是桌面的背景。如果背景設(shè)為默認(rèn)的白色,則導(dǎo)致彈窗后面是一片白色,看起來(lái)很丑。如果背景設(shè)置為透明,則彈窗后面會(huì)顯示出解鎖后的界面(即使有鎖屏密碼,也是會(huì)顯示解鎖后的界面的),一樣很影響視覺效果。
3.在廣播中啟動(dòng)鎖屏彈窗
我們?cè)O(shè)置的是鎖屏下才彈窗的,非鎖屏下就不適合彈出這個(gè)窗口了(你可以試一下,效果會(huì)很怪)。一般是注冊(cè)一個(gè)廣播接收器,在接收到指定廣播之后判斷是否需要彈窗,所以在BroadcastReceiver的接收代碼中需要先判斷是否為鎖屏狀態(tài)下:
@Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, intent.getAction()); KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); if (km.inKeyguardRestrictedInputMode()) { Intent alarmIntent = new Intent(context, AlarmActivity.class); alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(alarmIntent); } }
這里用到的是KeyguardManager類,用來(lái)管理鎖屏的,4.1之后該類的API新增了一個(gè)isKeyguardLocked()的方法判斷是否鎖屏,但在4.1之前,我們只能用inKeyguardRestrictedInputMode()方法,如果為true,即為鎖屏狀態(tài)。需要注意的是,在廣播中啟動(dòng)Activity的context可能不是Activity對(duì)象,所以需要添加NEW_TASK的標(biāo)志,否則啟動(dòng)時(shí)可能會(huì)報(bào)錯(cuò)。
4.更新彈窗信息
如果彈窗Activity本身并不主動(dòng)更新信息,當(dāng)有新的信息來(lái)時(shí)需要更新Activity的界面,由于在上面我們?cè)O(shè)的是singleInstance啟動(dòng)模式,所以需要覆寫onNewIntent(Intent intent)方法,這樣當(dāng)再次啟動(dòng)這個(gè)activity時(shí),新的intent會(huì)在該方法中傳入。
5.再次亮起屏幕
如果該Activity并未退出,但是被手動(dòng)按了鎖屏鍵,當(dāng)前面的廣播接收器再次去啟動(dòng)它的時(shí)候,屏幕并不會(huì)被喚起,所以我們需要在activity當(dāng)中添加喚醒屏幕的代碼,這里用的是電源鎖??梢蕴砑釉趏nNewIntent(Intent intent),因?yàn)樗鼤?huì)被調(diào)用。也可以添加在其他合適的生命周期方法。添加代碼如下:
PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE); if (!pm.isScreenOn()) { PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright"); wl.acquire(); wl.release(); }
6.一些權(quán)限
下面是實(shí)現(xiàn)過程中需要的一些權(quán)限,由于我是從項(xiàng)目代碼中抽取出來(lái)的,難免多加或遺漏,開發(fā)者自己注意一下:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
第一條是解鎖屏幕需要的,第二條是申請(qǐng)電源鎖需要的。
以上所述是小編給大家介紹的Android程序開發(fā)仿新版QQ鎖屏下彈窗功能,希望對(duì)大家有所幫助!
- Android屏幕鎖屏彈窗的正確姿勢(shì)DEMO詳解
- Android仿支付寶支付從底部彈窗效果
- Android如何實(shí)現(xiàn)鎖屏狀態(tài)下彈窗
- Android監(jiān)聽輸入法彈窗和關(guān)閉的實(shí)現(xiàn)方法
- Android實(shí)現(xiàn)氣泡布局/彈窗效果 氣泡尖角方向及偏移量可控
- Android仿支付寶微信支付密碼界面彈窗封裝dialog
- Android UI設(shè)計(jì)之AlertDialog彈窗控件
- Android自定義帶增長(zhǎng)動(dòng)畫和點(diǎn)擊彈窗提示效果的柱狀圖DEMO
- Android控件PopupWindow模仿ios底部彈窗
- Android實(shí)現(xiàn)自適應(yīng)屏幕的彈窗廣告
相關(guān)文章
Android TextView使用SpannableString設(shè)置復(fù)合文本的方法詳解
這篇文章主要介紹了Android TextView使用SpannableString設(shè)置復(fù)合文本的方法,結(jié)合實(shí)例形式詳細(xì)分析了Android中SpannableString類的功能及相關(guān)用法,需要的朋友可以參考下2016-08-08Android ContentProvider實(shí)現(xiàn)手機(jī)聯(lián)系人讀取和插入
這篇文章主要為大家詳細(xì)介紹了Android ContentProvider實(shí)現(xiàn)手機(jī)聯(lián)系人讀取和插入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Android實(shí)現(xiàn)動(dòng)態(tài)改變shape.xml中圖形的顏色
這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)態(tài)改變shape.xml中圖形的顏色,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-03-03深入理解Android中的Window和WindowManager
這篇文章給大家介紹了Window和WindowManager知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-02-02Android開發(fā)中實(shí)現(xiàn)發(fā)送短信的小程序示例
這篇文章主要介紹了Android開發(fā)中實(shí)現(xiàn)發(fā)送短信的小程序示例,文中還附帶了一個(gè)監(jiān)聽廣播接收者的升級(jí)版短信發(fā)送例子,需要的朋友可以參考下2016-04-04解決Android Studio日志太長(zhǎng)或滾動(dòng)太快問題
這篇文章主要介紹了解決Android Studio日志太長(zhǎng)或滾動(dòng)太快問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04Android中AlertDialog四種對(duì)話框的最科學(xué)編寫用法(實(shí)例代碼)
這篇文章主要介紹了Android中AlertDialog四種對(duì)話框的最科學(xué)編寫用法,本文通過代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11wenserver獲取天氣預(yù)報(bào)數(shù)據(jù)實(shí)例分享
wenserver獲取天氣預(yù)報(bào)數(shù)據(jù),實(shí)現(xiàn)android顯示天氣信息2013-12-12Android使用viewpager實(shí)現(xiàn)自動(dòng)無(wú)限輪播圖
這篇文章主要介紹了Android使用viewpager實(shí)現(xiàn)自動(dòng)無(wú)限輪播圖效果,實(shí)現(xiàn)方法大概有兩種,一種是viewpager+作為游標(biāo)的點(diǎn) 。另外一種是重寫viewpager,具體實(shí)現(xiàn)過程大家參考下本文2018-06-06