2015-07-16 2 views
4

Как я могу это сделать?Сервис с наложением - кнопка возврата назад

Текущего решение

запускает прозрачную деятельность, которая ловит заднюю прессу, направляет его к моей службе и закрывает себя потом. Но эта активность будет видна в текущих текущих действиях, и поэтому это не очень красивое решение.

Solutions видели

Я видел приложение, которое делает поймать заднюю прессу в службе - без деятельности, которая ловит заднюю прессу. Если я покажу текущие текущие действия, в этом приложении ничего нет.

Вопрос

Как это можно сделать? Я читал так много потоков, которые говорят, это невозможно, но я вижу, что есть приложения, которые достигают этого как-то ...

ответ

9

Я думаю, что узнал, как это работает ... НЕ ИСПОЛЬЗУЙТЕ 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); 
} 
+0

Как это сделать в классе обслуживания класса обслуживания –

+2

не отменяют такой метод –

+0

Какой флаг использовать вместо 'FLAG_NOT_FOCUSABLE'? –

0

Вы можете поймать обратно событие кнопки мыши. Для этого вам нужно создать контейнерный класс вашего OverlayView. Например: создать класс Overlay, который расширяет класс ViewGroup. Затем, в классе, раздуйте свой XML-макет и добавьте его в свою Overlay.class ViewGroup. Чем в Overlay.class переопределить метод dispatchKeyEvent (событие KeyEvent). Это все!

class Overlay extends FrameLayout{ 
 
    
 
    public Overlay(@NonNull Context context) { 
 
     super(new ContextThemeWrapper(context, R.style.AppTheme)); 
 

 
     initView(); 
 
    } 
 
    
 
    private void initView() { 
 
     //inflate your xml here 
 
     //than do: this.addView(<inflated view>); 
 
     //And in the end add your Overlay to WindowManager (in Service class of course). 
 
    } 
 
    
 
    @Override 
 
    public boolean dispatchKeyEvent(KeyEvent event) { 
 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
 
      //do staff here 
 
      // and return True! 
 
      return true; 
 
     } 
 
     return super.dispatchKeyEvent(event); 
 
    } 
 
}

0

Я нашел решение этой проблемы, он работает хорошо.

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); 

} 
} 
+0

Если вам нужно закрыть окно, просто проверьте видимость для обертки (FrameLayout) – RejoylinLokeshwaran

Смежные вопросы