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!