覆盖服务 - 按下按钮按下

pro*_*m85 10 service android overlay back

我怎样才能做到这一点?

当前解决方案

我发起了一个透明的活动,抓住了背压,然后将它转发给我的服务并随后关闭.但是这个活动将在当前的运行活动中可见,因此它不是一个非常漂亮的解决方案.

解决方案了

我已经看到一个应用程序确实能够在服务中抓住背压 - 没有一个活动可以抓住背压.如果我显示当前正在运行的活动,则此应用程序中没有任何内容.

如何才能做到这一点?我读了这么多线程说,这是不可能的,但我可以看到,有些应用程序以某种方式实现了......

pro*_*m85 12

我想我发现它是如何工作的...不要WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE在你的叠加视图中使用+覆盖dispatchKeyEvent你的视图:

 @Override
public boolean dispatchKeyEvent(KeyEvent event)
{
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
    {
        // handle back press
        // if (event.getAction() == KeyEvent.ACTION_DOWN)
        return true;
    }
    return super.dispatchKeyEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

  • 服务类不会覆盖此类方法 (4认同)

Rej*_*ran 6

我找到了这个问题的解决方案,效果很好。

public class MyFooterService extends Service{
View myview;
WindowManager wm;
FrameLayout wrapper;
public MyFooterService() {

}
 @Override
public void onCreate() {
    Log.d(TAG, "onCreate called");
    LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            90,  //height of ur layout
            WindowManager.LayoutParams.TYPE_PHONE,
            0,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.BOTTOM ;
    params.x = 0;
    params.y = 0;
   wrapper = new FrameLayout(this) {
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
              // handle the back button code;
             return true;
            }
          return super.dispatchKeyEvent(event);
        }
       //if pressed home key,
      public void onCloseSystemDialogs(String reason) {
            //The Code Want to Perform.
            System.out.println("System dialog " + reason);
            if (reason.equals("homekey")) {
                // handle home button 
            }
        }

     };
   myview = li.inflate(R.layout.my_footer, wrapper);   // here set into your own layout
   wm.addView(myview, params);

}
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您的服务中的 WindowManager 中附加了覆盖窗口,请将您的视图设置属性 setFocusableInTouchMode(true),并放置一个按键侦听器。您将收到关键事件,如下例所示:

view.setFocusableInTouchMode(true);
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            stopSelf();
            return true;
        }
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

已编辑,我没有使用好的 stackoverflow 帐户