1. 程式人生 > >仿QQ鎖屏狀態下訊息提醒

仿QQ鎖屏狀態下訊息提醒

最近專案開發中需要手機螢幕喚醒功能,查閱資料後整理了demo,當鎖屏狀態下收到通知,喚醒螢幕。主要思路為通過MyService服務傳送一條廣播,然後判斷如果為鎖屏狀態就啟動鎖屏訊息的activity.此時有震動和鈴聲提示,顯示倒計時。 下面請看效果圖:

實現步驟:

1:在服務中傳送廣播 由於寫這個demo,沒有引入第三方推送,我就用Service來代替,大致就是說,開啟一個後臺服務,在退出APP後,任然在執行,在退出3s後,傳送一條廣播訊息,通知廣播接收器有新的訊息需要提示使用者。

/**
 * 模仿推送,發訊息
 */
private void sendMessage() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Intent intent = new Intent("LockScreenMsgReceiver");
            sendBroadcast(intent); //傳送廣播
        }
    }).start();
}
  • 2.在廣播中啟動鎖屏彈窗

我們設定的是鎖屏下才彈窗的,非鎖屏下就不適合彈出這個視窗了。註冊一個廣播接收器,在接收到指定廣播之後判斷是否需要彈窗。

public class LockScreenMsgReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("LockScreenMsgReceiver")) {
            //管理鎖屏的一個服務
            KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
            if (km.inKeyguardRestrictedInputMode()) {
                //開啟倒計時服務
            Intent intents = new Intent(context, SendCodeService.class);
            context.startService(intents);
                //在廣播中啟動Activity的context可能不是Activity物件,所以需要新增NEW_TASK的標誌,否則啟動時可能會報錯。
            Intent alarmIntent = new Intent(context, MessageActivity.class);
                alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(alarmIntent); //啟動顯示鎖屏訊息的activity
            }
        }
    }
}

注意:

  • KeyguardManager類,用來管理鎖屏的,4.1之後該類的API新增了一個isKeyguardLocked()的方法判斷是否鎖屏,但在4.1之前,我們只能用inKeyguardRestrictedInputMode()方法,如果為true,即為鎖屏狀態。

  • 在廣播中啟動Activity的context可能不是Activity物件,有可能是Service或者其他BroadcastReceiver,所以需要新增NEW_TASK的標誌,否則啟動時會報錯 傳送倒計時驗證碼邏輯:  

    private Timer timer = new Timer(); private int time = 15; TimerTask task = new TimerTask() {     @Override     public void run() {         time--;         EventBus.getDefault().post(new TimeEvent(time));         if (time <= 0) {             EventBus.getDefault().post(-1);             stopSelf();             task.cancel();         }     } };3:activity頁面顯示訊息

  • protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //鎖屏狀態下顯示
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //解鎖
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //保持螢幕長亮
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); //開啟螢幕
        setContentView(R.layout.activity_message);
        EventBus.getDefault().register(this);
    }
    
    
    之所以能夠在鎖屏狀態下顯示訊息就是因為窗體物件的這個新增標誌位的這個方法起了作用。四個標誌位的作用,分別是鎖屏狀態下顯示,解鎖,保持螢幕長亮,開啟螢幕。這樣當Activity啟動的時候,它會解鎖並亮屏顯示。保持螢幕長亮這個標誌位是可選的。
    
  • 以上總結就是鎖屏喚醒的邏輯講解,下載完整程式碼請看連結地址: