国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android程序開發仿新版QQ鎖屏下彈窗功能

2019-12-12 05:25:51
字體:
來源:轉載
供稿:網友

新版的qq,可以在鎖屏下彈窗顯示qq消息,正好目前在做的項目也需要這一功能。經過各種試驗和資料查找,終于實現,過程不難,但是卻有一些地方需要注意。

下面是實現過程。

1.使用Activity,而不是View

QQ的彈窗一開始我以為是懸浮View,用WindowManager去添加,但是無論如何就是不顯示,后來在朋友提示下換成Activity來實現,在鎖屏狀態下就能彈窗了。

2.Activity的設置

Activity需要進行以下設置,才可以在鎖屏狀態下彈窗。

首先是onCreate方法,需要添加4個標志,如下:

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); // 自己的代碼 }

四個標志位顧名思義,分別是鎖屏狀態下顯示,解鎖,保持屏幕長亮,打開屏幕。這樣當Activity啟動的時候,它會解鎖并亮屏顯示。

然后在AndroidManifest.xml文件當中,對該activity的聲明需要加上以下屬性:

<activity android:name=".alarm.AlarmHandlerActivity" android:launchMode="singleInstance" android:excludeFromRecents="true" android:taskAffinity="" android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>

而對于布局文件,要顯示的view居中,背景透明。由于上面已經設置了背景為壁紙的背景,所以顯示的是桌面的背景。如果背景設為默認的白色,則導致彈窗后面是一片白色,看起來很丑。如果背景設置為透明,則彈窗后面會顯示出解鎖后的界面(即使有鎖屏密碼,也是會顯示解鎖后的界面的),一樣很影響視覺效果。

3.在廣播中啟動鎖屏彈窗

我們設置的是鎖屏下才彈窗的,非鎖屏下就不適合彈出這個窗口了(你可以試一下,效果會很怪)。一般是注冊一個廣播接收器,在接收到指定廣播之后判斷是否需要彈窗,所以在BroadcastReceiver的接收代碼中需要先判斷是否為鎖屏狀態下:

@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類,用來管理鎖屏的,4.1之后該類的API新增了一個isKeyguardLocked()的方法判斷是否鎖屏,但在4.1之前,我們只能用inKeyguardRestrictedInputMode()方法,如果為true,即為鎖屏狀態。需要注意的是,在廣播中啟動Activity的context可能不是Activity對象,所以需要添加NEW_TASK的標志,否則啟動時可能會報錯。

4.更新彈窗信息

如果彈窗Activity本身并不主動更新信息,當有新的信息來時需要更新Activity的界面,由于在上面我們設的是singleInstance啟動模式,所以需要覆寫onNewIntent(Intent intent)方法,這樣當再次啟動這個activity時,新的intent會在該方法中傳入。

5.再次亮起屏幕

如果該Activity并未退出,但是被手動按了鎖屏鍵,當前面的廣播接收器再次去啟動它的時候,屏幕并不會被喚起,所以我們需要在activity當中添加喚醒屏幕的代碼,這里用的是電源鎖??梢蕴砑釉趏nNewIntent(Intent intent),因為它會被調用。也可以添加在其他合適的生命周期方法。添加代碼如下:

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.一些權限

下面是實現過程中需要的一些權限,由于我是從項目代碼中抽取出來的,難免多加或遺漏,開發者自己注意一下:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>

第一條是解鎖屏幕需要的,第二條是申請電源鎖需要的。

以上所述是小編給大家介紹的Android程序開發仿新版QQ鎖屏下彈窗功能,希望對大家有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凯里市| 石门县| 沭阳县| 大渡口区| 安福县| 石楼县| 海安县| 襄樊市| 扎兰屯市| 和政县| 安岳县| 漾濞| 全州县| 扬中市| 罗平县| 古田县| 蒙城县| 南召县| 西城区| 偏关县| 策勒县| 来宾市| 耒阳市| 镇江市| 台湾省| 焦作市| 青冈县| 普宁市| 巨野县| 新昌县| 长沙县| 石屏县| 鲁甸县| 兴安盟| 道孚县| 固始县| 阜宁县| 仁怀市| 仁化县| 穆棱市| 温宿县|