2015-12-26 12 views
9

Я создаю приложение, которое запускает сервис на каком-либо мероприятии. Служба имеет оверлейный вид поверх каждого приложения (например, голова чата facebook). Я хочу остановить службу и удалить оверлейный вид на кнопках сенсорной кнопки навигации (назад, домой и в последних приложениях).Обнаружение события касания кнопок навигации внутри службы с окном

Я успешно сделал оверлейный вид, расширяя RelativeLayout, который работает совершенно нормально. Я следую this для просмотра наложения.

То же самое происходит с Facebook для расширения и закрытия чата. Заранее спасибо. :)

EDIT

Моя проблема в том же, как указано here.

ответ

8

Я столкнулся с той же проблемой, что и вы. Поэтому, после нескольких дней исследований, я нашел ниже класс для обнаружения (нажатие событий для домашних и недавних ключей).

public class HardwareKeyWatcher { 
    static final String TAG = "HardwareKeyWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHardwareKeysPressedListener mListener; 
    private InnerReceiver mReceiver; 


    public interface OnHardwareKeysPressedListener { 
     public void onHomePressed(); 

     public void onRecentAppsPressed(); 
    } 

    public HardwareKeyWatcher(Context context) { 
     mContext = context; 
     mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
     mFilter.setPriority(1000); 
    } 

    public void setOnHardwareKeysPressedListenerListener(OnHardwareKeysPressedListener listener) { 
     mListener = listener; 
     mReceiver = new InnerReceiver(); 
    } 

    public void startWatch() { 
     if (mReceiver != null) { 
      mContext.registerReceiver(mReceiver, mFilter); 
     } 
    } 

    public void stopWatch() { 
     if (mReceiver != null) { 
      mContext.unregisterReceiver(mReceiver); 
     } 
    } 

    class InnerReceiver extends BroadcastReceiver { 
     final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
     final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
     final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
       String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
       if (reason != null) { 
        Log.e(TAG, "action:" + action + ",reason:" + reason); 
        if (mListener != null) { 
         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
          mListener.onHomePressed(); 
         } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
          mListener.onRecentAppsPressed(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Используйте вышеприведенный класс, как показано ниже, в методе WithCreate в вашем сервисе.

@Override 
public void onCreate() { 
mHardwareKeyWatcher = new HardwareKeyWatcher(this); 
     mHardwareKeyWatcher.setOnHardwareKeysPressedListenerListener(new HardwareKeyWatcher.OnHardwareKeysPressedListener() { 
      @Override 
      public void onHomePressed() { 
       System.out.println("stop your service here"); 
      } 

      @Override 
      public void onRecentAppsPressed() { 
       System.out.println("stop your service here"); 
      } 
     }); 
mHardwareKeyWatcher.startWatch(); 
} 

и для обнаружения назад нажмите вы можете по этой ссылке (Service with Overlay - catch back button press). Я протестировал это решение, и это сработало для меня.

Таким образом, вы можете вызвать stopService в методах onHomePressed() и onRecentAppsPressed(), а затем переопределить метод onDestroy() в вашем классе обслуживания, как показано ниже.

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mWindowManager.removeView(mYourOverlayView); 
    mHardwareKeyWatcher.stopWatch(); 
} 

Пожалуйста, попробуйте эти вещи и сообщите нам ... удачи.

+0

Он работает как шарм. Большое спасибо. – Ajeet

3

Я думаю, что Facebook использует Activity. Вероятно, когда вы нажимаете «Плавающий вид», вы переходите к прозрачной активности.

+1

Да, но проблема с активностью в том, что она задерживается на 5 секунд http://stackoverflow.com/questions/5600084/starting-an-activity-from-a-service-after-home-button-pressed- without-the-5-seco – Ajeet

+0

Попробуйте использовать функцию перенаправления. Подобно этому Floating view -> redirect Activity -> Activity. –

+0

Не могли бы вы рассказать о своем решении о перенаправлении? Спасибо – Ajeet