आपको जो चाहिए उसे प्राप्त करने के लिए, आपको कुछ व्यू ग्रुप को विस्तारित करने की आवश्यकता है जिसे आप अपने विचारों के लिए रूट कंटेनर के रूप में उपयोग करने जा रहे हैं। चलो इस साथ शुरू करते हैं:
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 अनुमति जोड़ें।