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

來源:互聯網
上載者:User

標籤:

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

下面是實現過程。

1,使用Activity,而不是ViewQQ的彈窗一開始我以為是懸浮View,用WindowManager去添加,但是無論如何就是不顯示,後來在朋友提示下換成Activity來實現,在鎖屏狀態下就能彈窗了。 2.Activity的設定Activity需要進行以下設定,才可以在鎖屏狀態下彈窗。首先是onCreate方法,需要添加4個標誌,如下: [java] view plaincopy 
  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. }  
 四個標誌位顧名思義,分別是鎖屏狀態下顯示,解鎖,保持螢幕長亮,開啟螢幕。這樣當Activity啟動的時候,它會解鎖並亮屏顯示。
然後在AndroidManifest.xml檔案當中,對該activity的聲明需要加上以下屬性: [html] view plaincopy 
  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置中,背景透明。由於上面已經設定了背景為壁紙的背景,所以顯示的是案頭的背景。如果背景設為預設的白色,則導致彈窗後面是一片白色,看起來很醜。如果背景設定為透明,則彈窗後面會顯示出解鎖後的介面(即使有鎖屏密碼,也是會顯示解鎖後的介面的),一樣很影響視覺效果。
3.在廣播中啟動鎖屏彈窗我們設定的是鎖屏下才彈窗的,非鎖屏下就不適合彈出這個視窗了(你可以試一下,效果會很怪)。一般是註冊一個廣播接收器,在接收到指定廣播之後判斷是否需要彈窗,所以在BroadcastReceiver的接收代碼中需要先判斷是否為鎖屏狀態下: [java] view plaincopy 
  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,即為鎖屏狀態。需要注意的是,在廣播中啟動Activity的context可能不是Activity對象,所以需要添加NEW_TASK的標誌,否則啟動時可能會報錯。 4.更新彈窗資訊如果彈窗Activity本身並不主動更新資訊,當有新的資訊來時需要更新Activity的介面,由於在上面我們設的是singleInstance啟動模式,所以需要覆寫onNewIntent(Intent intent)方法,這樣當再次啟動這個activity時,新的intent會在該方法中傳入。 5.再次亮起螢幕如果該Activity並未退出,但是被手動按了鎖屏鍵,當前面的廣播接收器再次去啟動它的時候,螢幕並不會被喚起,所以我們需要在activity當中添加喚醒螢幕的代碼,這裡用的是電源鎖。可以添加在onNewIntent(Intent intent),因為它會被調用。也可以添加在其他合適的生命週期方法。添加代碼如下: [java] view plaincopy 
  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.一些許可權下面是實現過程中需要的一些許可權,由於我是從項目代碼中抽取出來的,難免多加或遺漏,開發人員自己注意一下: [html] view plaincopy 
  1. <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>  
  2. <uses-permission android:name="android.permission.WAKE_LOCK"/>  

第一條是解鎖螢幕需要的,第二條是申請電源鎖需要的。 本文原創,轉載請註明出處:http://blog.csdn.net/maosidiaoxian/article/details/40587935

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.