2017-03-15 18 views
6

मैं विंडोज मैनेजर का उपयोग कर सेवा पर बैकप्रेस बटन कैसे सुन सकता हूं, यह जानने के लिए कई स्टैक ओवरफ्लो प्रश्न देख रहा हूं। अधिकांश उत्तरों का प्रस्ताव है कि यह संभव नहीं है, हालांकि मैं देख सकता हूं कि मैसेंजर इसे बहुत अच्छी तरह से संभालता है।मैसेंजर चैट हेड सेवा जैसी सेवा से बैकबटन/होम प्रेस का पता कैसे लगाएं?

मैसेंजर अपने मुख्य चैट सेवा पर बैकप्रेस बटन कैसे संभालता है? (या मैं पूरी तरह से गलत हूं और वे विंडोज मैनेजर का उपयोग कर एक सेवा नहीं हैं?)

उत्तर

3

आपको जो चाहिए उसे प्राप्त करने के लिए, आपको कुछ व्यू ग्रुप को विस्तारित करने की आवश्यकता है जिसे आप अपने विचारों के लिए रूट कंटेनर के रूप में उपयोग करने जा रहे हैं। चलो इस साथ शुरू करते हैं:

public class BackButtonAwareLinearLayout extends LinearLayout { 

    public interface BackButtonListener { 
     void onBackButtonPressed(); 
    } 

    @Nullable 
    private BackButtonListener mListener; 

    public BackButtonAwareLinearLayout(Context context) { 
     super(context); 
    } 

    public BackButtonAwareLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public BackButtonAwareLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public void setBackButtonListener(@Nullable BackButtonListener listener) { 
     mListener = listener; 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK 
       && mListener != null) { 
      mListener.onBackButtonPressed(); 
      return true; 
     } 
     return super.dispatchKeyEvent(event); 
    } 
} 

असल में, अधिभावी dispatchKeyEvent यहाँ क्या हमारे लिए एक चाल करता है। फिर कुछ एक्सएमएल में इसके बारे में एक इस्तेमाल करते हैं (मैं कहा जाता है यह chat_head_container.xml):

<?xml version="1.0" encoding="utf-8"?> 
<com.pablo432.myapplication.BackButtonAwareLinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="48sp" 
     android:text="Hello, world!" 
     android:textColor="#000" 
     android:background="#f5f5f5" 
     android:gravity="center"/> 

</com.pablo432.myapplication.BackButtonAwareLinearLayout> 

इसके बाद, एक सेवा WindowManager को हमारे विचार कहते हैं कि (हालांकि मैं तुम्हें यह कैसे करना है पता लगता है बनाते हैं, मैं इसे वैसे भी पूर्णता के लिए) के लिए पोस्ट करेंगे:

public class ChatHeadService extends Service 
     implements BackButtonAwareLinearLayout.BackButtonListener { 

    private WindowManager mWindowManager; 
    private BackButtonAwareLinearLayout mRootContainer; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mRootContainer = (BackButtonAwareLinearLayout) inflater.inflate(
       R.layout.chat_head_container, null, false); 
     mRootContainer.setBackButtonListener(this); 

     WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       PixelFormat.TRANSPARENT); 

     mWindowManager.addView(mRootContainer, layoutParams); 
    } 

    @Override 
    public void onBackButtonPressed() { 
     mRootContainer.setBackButtonListener(null); 
     mWindowManager.removeView(mRootContainer); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mRootContainer != null) mWindowManager.removeView(mRootContainer); 
    } 
} 

इतने लंबे समय कहानी छोटी, BackButtonAwareLinearLayout एक श्रोता इंटरफेस को उजागर करता है, हमारी सेवा को लागू करने और लेआउट को ही सदस्यता के लिए जरूरत है।

यह भी ध्यान रखें कि यह पते बैक बटन को संभालने में मदद करता है। होम बटन को संभालने के लिए, आप https://stackoverflow.com/a/31340960 और https://stackoverflow.com/a/33580971 पर एक नज़र डालना चाहेंगे - मूल रूप से मेरा उत्तर उन दो लिंक + https://stackoverflow.com/a/15980900 से सारांश का थोड़ा सा है, लेकिन इसमें कुछ बदलाव शामिल हैं (उदाहरण के लिए, आप WindowManager में FLAG_NOT_FOCUSABLE सेट नहीं कर सकते .LayoutParams)।

बेशक आपको StartService पर कॉल करके कहीं भी अपनी सेवा शुरू करने की आवश्यकता है, एंड्रॉइडमैनीफेस्ट.एक्सएमएल में यह सेवा घोषित करें और एक SYSTEM_ALERT_WINDOW अनुमति जोड़ें।

संबंधित मुद्दे