java - FLAG_NOT_TOUCH_MODAL 不工作/Android

标签 java android android-activity overlay

我正在 Android 上开发应用程序。我的应用程序本质上是一个通话记录。我想要的是当设备收到来电时,我的应用程序在所有其他 Activity 上方显示三个按钮。

我现在拥有的是 BroadcastReceiver它接收 PHONE_STATE Intent ,当检测到传入调用时,将启动一个 Activity 。启动的 Activity 包含我想要显示的按钮。

当OverlayActivity出现时,下面的所有Activity都停止接收触摸事件,即我只能触摸OverlayActivity。我如何让他们收到事件?

现在在我的 BroadCastReceiver 中我开始 Activity :

//PhonecallReceiver.java
public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(myContext, OverlayActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.putExtra("phone_number", number);
    context.startActivity(i);
}

实际 Activity

//OverlayActivity.java:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.CENTER | Gravity.TOP;
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater inflater = getLayoutInflater();
    mLayout = (LinearLayout) inflater
            .inflate(R.layout.overlay_layout, null);
    wm.addView(mLayout, params);
    }

最佳答案

@DJClayworh

谢谢你的提示:)

我设法使用与考试相同的代码解决了我的问题,但我使用的不是 Activity ,而是服务。您只需启动服务即可显示叠加层。这是一个例子:

public class OverlayService extends Service {

    private WindowManager windowManager;
    private View layout;

    @Override
    public void onCreate() {
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            // very important, this sends toush events to underlying views
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
            PixelFormat.TRANSLUCENT);
        // Layout gravity
        params.gravity = Gravity.TOP | Gravity.CENTER;
        params.x = 0; params.y = 100;

        LayoutInflater li = (LayoutInflater) getApplicationContext()
             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // Your overlay layout
        layout = li.inflate(R.layout.overlay, null;

        // This displays overlay on the screen
        windowManager.addView(layout, params);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // Error will occur if this is missing.
        if (layout != null)
            windowManager.removeView(layout);
    }
}

关于java - FLAG_NOT_TOUCH_MODAL 不工作/Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221535/

相关文章:

java - 什么时候/为什么我应该在方法上使用 Firebase @Exclude 注释

android - 碰撞在 Box2D 与 Cocos2d Android 中无法正常工作

android - 在 fragment 中使用 Context 和 getactivity 之间的区别?

android - 如果调用它的 Activity 已完成,如何检查(Android)异步任务?

Android Studio 3.0.1 显示模拟器 : Process finished with exit code 1

java - Eclipse RCP PropertyTester 永远不会通过菜单可见调用

java - 提交表单并得到 404 空响应

android - onActivityResult 方法未被调用 Android

java - 如何在 vaadin 中格式化表值?

android - Material TabLayout 标高不起作用