日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

android開發(fā)技巧—仿新版QQ鎖屏下彈窗

 QCamera 2015-02-03

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

下面是實現(xiàn)過程。

1,使用Activity,而不是View

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

2.Activity的設(shè)置

Activity需要進行以下設(shè)置,才可以在鎖屏狀態(tài)下彈窗。
首先是onCreate方法,需要添加4個標(biāo)志,如下:
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     final Window win = getWindow();  
  4.     win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED  
  5.             | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD  
  6.             | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
  7.             | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);  
  8.   
  9.     // 自己的代碼  
  10. }  

四個標(biāo)志位顧名思義,分別是鎖屏狀態(tài)下顯示,解鎖,保持屏幕長亮,打開屏幕。這樣當(dāng)Activity啟動的時候,它會解鎖并亮屏顯示。
然后在AndroidManifest.xml文件當(dāng)中,對該activity的聲明需要加上以下屬性:
  1. <activity android:name=".alarm.AlarmHandlerActivity"  
  2.           android:launchMode="singleInstance"  
  3.           android:excludeFromRecents="true"  
  4.           android:taskAffinity=""  
  5.           android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>  

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

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

我們設(shè)置的是鎖屏下才彈窗的,非鎖屏下就不適合彈出這個窗口了(你可以試一下,效果會很怪)。一般是注冊一個廣播接收器,在接收到指定廣播之后判斷是否需要彈窗,所以在BroadcastReceiver的接收代碼中需要先判斷是否為鎖屏狀態(tài)下:
  1.     @Override  
  2.     public void onReceive(Context context, Intent intent) {  
  3.         Log.d(LOG_TAG, intent.getAction());  
  4.         KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);  
  5.         if (km.inKeyguardRestrictedInputMode()) {  
  6.             Intent alarmIntent = new Intent(context, AlarmActivity.class);  
  7.             alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  8.             context.startActivity(alarmIntent);  
  9.         }  
  10.     }  

這里用到的是KeyguardManager類,用來管理鎖屏的,4.1之后該類的API新增了一個isKeyguardLocked()的方法判斷是否鎖屏,但在4.1之前,我們只能用inKeyguardRestrictedInputMode()方法,如果為true,即為鎖屏狀態(tài)。需要注意的是,在廣播中啟動Activity的context可能不是Activity對象,所以需要添加NEW_TASK的標(biāo)志,否則啟動時可能會報錯。

4.更新彈窗信息

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

5.再次亮起屏幕

如果該Activity并未退出,但是被手動按了鎖屏鍵,當(dāng)前面的廣播接收器再次去啟動它的時候,屏幕并不會被喚起,所以我們需要在activity當(dāng)中添加喚醒屏幕的代碼,這里用的是電源鎖??梢蕴砑釉趏nNewIntent(Intent intent),因為它會被調(diào)用。也可以添加在其他合適的生命周期方法。添加代碼如下:
  1. PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);  
  2. if (!pm.isScreenOn()) {  
  3.     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |  
  4.             PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");  
  5.     wl.acquire();  
  6.     wl.release();  
  7. }  

6.一些權(quán)限

下面是實現(xiàn)過程中需要的一些權(quán)限,由于我是從項目代碼中抽取出來的,難免多加或遺漏,開發(fā)者自己注意一下:
  1. <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>  
  2. <uses-permission android:name="android.permission.WAKE_LOCK"/>  

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

本文原創(chuàng),轉(zhuǎn)載請注明出處:http://blog.csdn.net/maosidiaoxian/article/details/40587935

參考資料:
http://bbs.csdn.net/topics/390425777 CSDN論壇帖子 發(fā)帖人: JJMM2009
android api 文檔。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多