1. 程式人生 > >android 應用內通知,仿通知欄通知效果,通知Toast,懸浮窗

android 應用內通知,仿通知欄通知效果,通知Toast,懸浮窗

    開發應用,有時候需要在應用內通知提示,如果涉及內部通知提示過多,就需要考慮展示問題,而且還有需要考慮,內部通知提示,不能影響使用者的操作行為,以及切換介面的時候(Activity切換)通知提示還得存在一定時間後消失或者不消失,結合這些問題,自己嘗試去搞搞,最後有點效果出來,先將效果圖貼出:
這裡寫圖片描述這裡寫圖片描述

涉及知識點:

  • WindowManager 的使用
  • BroadcastReceiver註冊、銷燬
  • 監聽home鍵事件
  • ListView和ArrayAdapter
  • Inflate新增的佈局
  • handler.postDelayed

分析

  • 通過Application獲取開啟程式的視窗getSystemService(Context.WINDOW_SERVICE)
  • 通過inflate例項自定義佈局
  • 對Window的flag進行設定,設定FLAG_KEEP_SCREEN_ON(當該window對使用者可見時,讓裝置螢幕處於高亮(bright)狀態)和FLAG_NOT_FOCUSABLE(讓window不能獲得焦點,這樣使用者快就不能向該window傳送按鍵事件及按鈕事件)
  • 對Window的type進行設定型別,對於API 大於18的設定TYPE_TOAST(toast型別的window),小於則設定TYPE_PHONE(電話視窗。它用於電話互動(特別是呼入)。它置於所有應用程式之上,狀態列之下),需要獲取許可權
  • 其他就是對列表進行開發,使用ListView和adapter

貼上程式碼:

```
windowManager = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    layoutContent = (LinearLayout) View.inflate(context, R.layout.jnotice, null);
    listView = (ListView) layoutContent.findViewById(R.id.listView);
    int w = WindowManager.LayoutParams.MATCH_PARENT;
    int h = WindowManager.LayoutParams.WRAP_CONTENT;
    int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
    int type;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        type = WindowManager.LayoutParams.TYPE_TOAST;
    } else {
        type = WindowManager.LayoutParams.TYPE_PHONE;
    }
   layoutParams = new WindowManager.LayoutParams(w, h, type, flags, PixelFormat.TRANSLUCENT);
    layoutParams.gravity = Gravity.TOP;
```