Androidのすべてのアプリケーションの上で常に実行されるビューインサービスを作成しました。
サービスの初期動作は TYPE_SYSTEM_ALERT です。
WindowManager.LayoutParams layparams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
layparams .gravity = Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(serviceView, layparams );
実行時にサービスの動作を変更するということは、タッチ時に TYPE_SYSTEM_ALERT と TYPE_SYSTEM_OVERLAY を切り替えることを意味します。ビュー パラメータの外側をタッチすると、ビュー パラメータの内側をタッチすると、切り替えが行われます。
layparams .type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
Using updateViewLayout(serviceView, layparams )
問題:ビューの外側に触れると、最初のタッチで TYPE_SYSTEM_OVERLAY がアクティブになり、その後アプリの外側が正常に動作します。TYPE_SYSTEM_OVERLAY が機能している場合、その後ビュー内をタッチすると、ビューのアクションではなく、ビューの背後にあるオブジェクトのアクションがトリガーされます。しかし、一度ビューに触れると TYPE_SYSTEM_ALERT が適用され、ビューは正常に動作するようになります。
現在の実装: レイアウト パラメーター間で切り替えが行われたときに、その特定の処理を行うには 2 回タッチする必要があります。