Android 使用懸浮視窗

来源:互联网 发布:真的有迷你猪吗 知乎 编辑:程序博客网 时间:2024/05/17 14:17

1. 在Activity 啟動 Service

startService(new Intent(this, FloatingShortcutService.class));<service android:name="com.yenhsun.floatingshortcut.FloatingShortcutService" />


2. 加入 permission

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

3. 設定 params

    public WindowManager.LayoutParams getDefaultWindowManagerParamsSettings() {        WindowManager.LayoutParams params = new WindowManager.LayoutParams();        params.x = 0;        params.y = 0;        params.height = 500;        params.width = 500;        params.type = LayoutParams.TYPE_PHONE;        params.format = PixelFormat.RGBA_8888;        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED                | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;        params.gravity = Gravity.LEFT | Gravity.TOP;        params.windowAnimations = android.R.style.Animation_Toast; //僅可以使用系統內的動畫種類        params.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN;        return params;    }

4. 使用windowManager.addView

private WindowManager wm;wm = (WindowManager)mContext.getSystemService("window");View mFloating = new View(mContext);wm.addView(mFloating, wmParams);

5. 記得最後要 remove

wm.removeView(mFloating);

簡單的說,就是使用一個Service 加入一個 view 到 windowmanager 內,就可以在螢幕上看到你所加入的視窗,

只要Service 一直存在系統中,就可以一直控制這個 View。

但是 backaground Service 常常因為內存的關係所以被系統 kill ,如果設定成 foreground service 又會看到 notification icon,這該如何是好呢?

有個小方法,就是把 notification 顯示的時間設定成最大 (ex 999999) ,並且把 priority 設成最小 (ex Notification.PRIORITY_MIN)

就可以幾乎看不到 notification 但是又是 foreground service!